Ejecuto varios comandos de sustitución como el núcleo de un script de colorize para maven . Uno de los sedcomandos utiliza una expresión regular que funciona para buscar en el shell como se explica aquí . La implementación actual (que no funciona) se puede encontrar aquí .
Cuando incluyo una de las variantes del comando en el script, ocurre un comportamiento diferente:
Variante 1:
$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Adaptado al guión:
-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Error: el shell genera la misma información que si escribiera $ sed. ¿¡Extraño!?
Variante 2:
$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Adaptado al guión:
-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Error:
sed: -e expresión # 7, char 59: referencia inválida \ 1 en el RHS del comando `s '
regex
sed
substitution
JJD
fuente
fuente

-i(opción de editar en el lugar) con-re, lo que resultó en-ire(de modo que-iconsumía elrefragmento comoSUFFIXargumento y, por lo tanto, no se habilitaba el modo de expresión regular extendida); cambiándolo para-i -resolucionar el problema.'y las comillas dobles"se tratan de manera ligeramente diferente, especialmente al interpretar$vars. Por ejemplo:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"funciona, pero:sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'no.Respuestas:
¿No necesitas capturar para que funcione? es decir, para la variante 2:
(Nota: no probado)
Sin el argumento -r, las referencias inversas (como \ 1) no funcionarán.
fuente
-ropción de sed parece ser necesaria para que funcione la referencia inversa. Por ejemplo,sed -e 's/([[:digit:]])/is a digit/'funciona perosed -e 's/([[:digit:]])/\1 is a digit/produce el error original sin-rsed. NOTA: la primera invocación de sed busca un literal(<digit>)y no es un grupo de captura.-irelugar de usar-ri. El pedido importa :-)Este error es común para los paréntesis que no tienen escape. Escapa de ellos y vuelve a intentarlo.
Por ejemplo:
Debe escaparse con barras invertidas antes de cada paréntesis:
fuente
-rno tiene que escapar del paréntesis.Si no se proporciona la opción
-r/--regexp-extended, entonces se deben escapar los paréntesis de captura.fuente
Necesitas escapar
/después de la.O si no quiere preocuparse por escapar, use
|EDITAR:
fuente
sed: -e expression #7, char 58: Invalid range end. La respuesta de @Denis funciona.