Me topé con un comportamiento que no puedo explicar, espero que algunos de ustedes puedan ayudarme.
Intento generar una especie de documentación a partir de un Ant
proyecto más grande, como tal, la uso sed
para filtrar la información de los archivos que necesito en la documentación más adelante.
Tengo un archivo de compilación ant normal con líneas como esta:
<target name="targetA" depends="targetD" description="some fancy description">
...
<target name="targetB" depends="targetD" description="some fancy description">
...
<target name="targetC" depends="targetD" description="some fancy description">
Ahora sigo esta línea sed:
sed -nr 's/.*?target name="(.*?)".*="(.*?)".*/ * \1 - \2/p'
Debería darme:
* targetA - some fancy description
* targetB - some fancy description
* targetC - some fancy description
En lugar de eso obtengo:
* targetA" depends="targetD" - some fancy description
* targetA" depends="targetD" - some fancy description
* targetA" depends="targetD" - some fancy description
Intenté omitir la salida del segundo grupo para verificar que es el primer grupo el que realmente coincide con toda la parte "depende", aunque configuré la expresión regular para que no sea codiciosa hasta la siguiente comilla doble.
¿Que me estoy perdiendo aqui?
Usar una expresión regular más explícita como esta funciona como se esperaba, pero todavía no entiendo lo codicioso:
sed -nr 's/.*?target name="(.*?)".*=.*="(.*?)".*/ * \1 - \2/p'
Como esto podría ser de interés, estoy usando sed-4.2.2-4ubuntu1 en ubuntu linux (instalación predeterminada)
Respuesta1
Sed no admite coincidencias no codiciosas como se ve en ".*?" expresión.
Prueba esto:
sed -nr 's/.*target name="([^"]*)" .*="(.*)".*/ * \1 - \2/p' file
Producción:
* targetA - alguna descripción elegante * targetB - alguna descripción elegante * targetC - alguna descripción elegante