comportamento estranho na correspondência de padrões sed

1

abaixo dois exemplos são comportamentos esperados. sem problemas
as opções "xxx2", "xxx @" coincidem com "xxx". padrão.

$ echo abc1xxx2abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*//p'
abc1xxx2abc3

$ echo abc1xxx@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*//p'
abc1xxx@abc3

também abaixo de dois exemplos são comportamentos esperados.
tanto "xxx @", "xxxy" combinam com "xxx". padrão
mas logo ao lado "@" o char não é compatível com o padrão, então nenhuma saída

$ echo abc1xxx@@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*//p'
no output

$ echo abc1xxxy@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*//p'
no output

mas se eu mudei o "y" no exemplo acima para "x", então,
de repente o padrão é correspondido, mesmo que o próximo caractere seja "@"
Eu não consigo entender esse comportamento

$ echo abc1xxxx@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*//p'
abc1xxxx@abc3abc4
    
por mug896 22.01.2017 / 00:08

1 resposta

2

Vamos alterar seu padrão um pouco para que possamos ver o que acontece (basta adicionar ^.* ao início para que toda a linha de entrada seja substituída pela referência anterior):

$ echo abc1xxxx@abc3abc4@111 | sed -rn 's/^.*((abc.|xxx.){3}).*//p'
xxx@abc3abc4

Portanto, corresponde a xxx@ seguido por abc3 seguido por abc4 . Isso é perfeitamente legal e esperado, já que o padrão está procurando por três ocorrências de abc. ou xxx. .

O abc1x no início de sua linha de saída nunca foi afetado pelo padrão e, portanto, também nunca foi substituído pela substituição. Acabou de ser passado da entrada.

    
por 22.01.2017 / 00:13