Ejecuto varios comandos de sustitución como el núcleo de un script de colorize para maven . Uno de los sed
comandos 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-i
consumía elre
fragmento comoSUFFIX
argumento y, por lo tanto, no se habilitaba el modo de expresión regular extendida); cambiándolo para-i -re
solucionar 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
-r
opció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-r
sed. NOTA: la primera invocación de sed busca un literal(<digit>)
y no es un grupo de captura.-ire
lugar 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
-r
no 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.