2012-09-04 8 views
7

recientemente descubrí que este sencillo trabajo fino sed expresión en Linux o bajo Cygwin pero falla en Mac con una "etiqueta indefinido" error:sed "etiqueta indefinido" en MacOS

$ sed '/SUCCESSFUL/d ; /\[java\]/!b label; s/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d; :label /^\s*$$/d; s/^/monitor: /' 
sed: 1: "/SUCCESSFUL/d ; /\[java ...": undefined label 'label; s/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d; :label /^\s*$$/d; s/^/monitor: /' 

sed en MacOS es una Variante BSD con diferentes opciones que la contraparte GNU. Sin embargo, man sed indica claramente que la versión de MacOS de sed admite etiquetas, entonces ¿por qué este error, y lo más importante cómo resolverlo?

Respuesta

3

El nombre de la etiqueta termina con el primer salto de línea literal, no en el semi-colon. Hay dos formas fáciles de resolver el problema. Añadir nuevas líneas literales:

sed '/SUCCESSFUL/d 
    /\[java\]/!b label 
    s/\s\+\[java\]// 
    /^\s*$$/d; /Compiling/!d 
    :label 
    /^\s*$$/d 
    s/^/monitor: /' 

O usos múltiples opciones: -e

sed -e '/SUCCESSFUL/d ; /\[java\]/!b label' \ 
    -e 's/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d' \ 
    -e':label' -e'/^\s*$$/d; s/^/monitor: /' 
2

Hay un montón de preguntas similares en SO, pero la mayoría de ellas se deben al comportamiento de -i que difieren entre plataformas, por lo que esto es diferente.

En este caso, el problema es bastante simple: parece que las referencias de las etiquetas solo pueden ir hacia atrás en la versión BSD de sed, mientras que la versión GNU permite usar referencias directas. Eso está en MacOS, el :label debe aparecer antes de el b label.

La solución es reescribir la expresión para definir la etiqueta antes de la bifurcación, o en el caso de la expresión anterior, darse cuenta de que la bifurcación es una especie de "si este patrón no está presente ... saltar adelante". En este caso la expresión se puede ampliar para no necesitar la etiqueta en el primer lugar:

sed '/SUCCESSFUL/d ; /\s+\[java\]\s*/d; /\[java\]/s/\s\+\[java\]//; /Compiling/!d; /^\s*$$/d; s/^/monitor: /' 
+0

+1 y buena captura. También ayuda a visualizar el problema como un código sangrado, en lugar de con un solo liner-itis :-) Buena suerte. – shellter