Quão ganancioso é sed em padrões de correspondência?

5

Eu sei que sed é ganancioso quando combina padrões. Mas quão ganancioso é isso?

Considere esses exemplos.

$ echo 'foobar123' | sed 's/[0-9]*/(&)/'
()foobar123
$ echo 'foobar123' | sed 's/[0-9][0-9]*/(&)/'
foobar(123)

Por que o segundo exemplo imprime foobar(1)23 e, em vez disso, imprime foobar(123) ?

    
por borncrusader 07.06.2011 / 18:28

2 respostas

8

É tão ganancioso quanto possível.

O primeiro padrão ("qualquer dígito zero ou mais vezes") corresponde a todos os lugares, mas apenas uma vez em seu exemplo, porque não há sinalizador g .

Compare:

$ echo foobar123 | sed 's/[0-9]*/(&)/g'
()f()o()o()b()a()r(123)

Note como ele se torna ganancioso assim que pode, ou seja, há dígitos dos quais mais do que zero podem ser consumidos.

A mesma coisa para o segundo padrão ("qualquer dígito único, mais qualquer dígito zero ou mais vezes"). Ele não pode corresponder em nenhum lugar antes do 123 . Uma vez lá, consome o maior número possível.

    
por 07.06.2011 / 18:36
0

O motivo da confusão é

1) sed corresponde o mais cedo possível (portanto, primeiro exemplo)
2) sed * é tão ganancioso quanto possível (daí o segundo exemplo)

No modo de correspondência única, depois de encontrar uma correspondência, o sed não procura jogos posteriores nos quais possa ser mais ganancioso.

    
por 07.06.2011 / 18:58

Tags