Puedo ejecutar varios sustitución de comandos como el núcleo de un colorear script para maven.
Uno de los sed comandos utiliza una expresión regular que trabaja encontrar en la shell como se discuten aquí. La corriente (no de trabajo) aplicación puede encontrarse aquí.

Cuando me incluir una de las variantes del comando en el script se produce un comportamiento diferente:

Variante 1:

$ sed -re "s/([a-zA-Z0-9./\ :-]+)//g"

Adaptado a la secuencia de comandos:

-re "s/WARNING: ([a-zA-Z0-9./\ :-]+)/${warn}WARNING: ${c_end}/g" \

De Error: El shell salidas de la misma información que si me gustaría escribir $ sed. Extraño!?


Variante 2:

$ sed -e "s/\([a-zA-Z0-9./\ :-]\+\)//g"

Adaptado a la secuencia de comandos:

-e "s/WARNING: \([a-zA-Z0-9./\ :-]\+\)/${warn}WARNING: ${c_end}/g" \

De Error:

sed: e-expresión #7, char 59: referencia no válida \1 `s’ del comando de RHS

  • En mi caso me ha combinado un -i (edición en lugar de la opción) con -re, lo que resulta en -ire (de modo que -i consumía el re fragmento como su SUFFIX argumento y, por tanto, la expresión regular extendida de modo de no estar habilitado); el cambio a -i -re solucionado el problema.
  • También es de notar que las comillas simples ' las comillas dobles y " son tratados un poco diferente, sobre todo cuando la interpretación de $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.
InformationsquelleAutor JJD | 2013-05-19

4 Comentarios

  1. 35

    No necesita realmente de captura para que funcione? es decir, para la variante 2:

    -r -e "s/WARNING: (\([a-zA-Z0-9./\ :-]\+\))/${warn}WARNING: ${c_end}/g" \

    (Nota: no probado)

    Sin el argumento-r back-referencias (como \1) no funciona.

    • El -r opción a sed que parece ser necesario para la parte de atrás de referencia para el trabajo. E. g sed -e 's/([[:digit:]])/is a digit/' funciona, pero sed -e 's/([[:digit:]])/\1 is a digit/ produce el error original sin -r a sed. NOTA: de la primera invocación de la sed busca un literal (<digit>) y no una captura de grupo.
    • El comentario de abajo la respuesta es en realidad una respuesta. Tal vez usted puede editar su respuesta a reflexionar.
    • usted debería haber publicado tu comentario como una respuesta
    • No importa mi error fue usar -ire en lugar de utilizar -ri. El orden importa 🙂
  2. 46

    Este error es común que los paréntesis que no se escapan. Escapar de ellos, y tratar de nuevo.


    Por ejemplo:

    /^$/b
    :loop
    $!{
    N
    /\n$/!b loop
    }
    s/\n(.)//g

    Debe ser escapado con barras invertidas antes de cada paréntesis:

    /^$/b
    :loop
    $!{
    N
    /\n$/!b loop
    }
    s/\n\(.\)//g
    • Atención, si usted utiliza -r usted no tiene que salir de los paréntesis.
  3. 4

    Necesita escapar de la / después de la .

    sed -e "s/\([a-zA-Z0-9.\/\ :-]\+\)//g"

    O si usted no quiere preocuparse por el escape, el uso de |

    sed -e "s|\([a-zA-Z0-9./\ :-]\+\)||g"

    EDICIÓN:

    sed -e "s|WARNING: \([a-zA-Z0-9.-/\ :]+\)|${warn}WARNING: ${c_end}|g"
    • Sonido razonable. Pero no funciona en el contexto de la secuencia de comandos.
    • Comprobar mi edición, tal vez puede ayudar
    • Lo siento. La edición de genera el error: sed: -e expression #7, char 58: Invalid range end. @Denis respuesta de obras.
    • Ok, entonces +1 para @Denis respuesta
  4. 0

    Si el -r/--regexp-extended opción no está prevista, luego de la captura de los paréntesis deben ser escapado.

Dejar respuesta

Please enter your comment!
Please enter your name here