padrão sed regex correspondeu a ganancioso, embora não devesse

padrão sed regex correspondeu a ganancioso, embora não devesse

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 Antprojeto maior, como tal utilizo sedpara 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

informação relacionada