Me deparei com um comportamento que não consigo explicar, espero que alguns de vocês possam me ajudar.
Tento gerar uma espécie de documentação a partir de um Ant
projeto maior, como tal utilizo sed
para filtrar as informações dos arquivos, que preciso na documentação posteriormente.
Eu tenho um buildfile ant normal com linhas 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">
Agora continuo com esta linha sed:
sed -nr 's/.*?target name="(.*?)".*="(.*?)".*/ * \1 - \2/p'
Deveria me dar:
* targetA - some fancy description
* targetB - some fancy description
* targetC - some fancy description
Em vez disso, recebo:
* targetA" depends="targetD" - some fancy description
* targetA" depends="targetD" - some fancy description
* targetA" depends="targetD" - some fancy description
Tentei pular a saída do segundo grupo para verificar se é o primeiro grupo que realmente corresponde a toda a parte "depende", embora eu tenha definido o regex como não ganancioso até a próxima aspa dupla.
O que estou perdendo aqui?
Usar um regex mais explícito como este funciona como esperado, mas ainda não entendi a coisa gananciosa:
sed -nr 's/.*?target name="(.*?)".*=.*="(.*?)".*/ * \1 - \2/p'
Como isso pode ser interessante, estou usando sed-4.2.2-4ubuntu1 no Ubuntu Linux (instalação padrão)
Responder1
Sed não oferece suporte a correspondências não gananciosas, como visto em ".*?" expressão.
Experimente isto:
sed -nr 's/.*target name="([^"]*)" .*="(.*)".*/ * \1 - \2/p' file
Saída:
* targetA - alguma descrição sofisticada * targetB - alguma descrição sofisticada * targetC - alguma descrição sofisticada