grep -E sintaxe de regex alterada?

1

Muita documentação que li diz que o seguinte comando deve coincidir com as linhas em que x aparece pelo menos 3 vezes seguidas, mas não mais do que 4 vezes seguidas:

grep -E {x}\{3,4}

Por exemplo link ou link

Presumivelmente, isso significa que isso não deve retornar correspondências:

xxxxx
xxxxxx

Mas eu criei um testfile com exatamente isso e executando este comando

grep -o -E [x]\{3,4} testfile

retornou esta saída:

xxxx
xxxx

Ele está combinando as duas linhas. O que está acontecendo? Isso está no shell bash no Solaris.

    
por Fasil Alemante 12.09.2015 / 02:50

1 resposta

6

Primeiro, você deve sempre citar a expressão grep, como tentar lembrar o que o shell faz com que caractere especial é uma dor:

grep -o -E '[x]{3,4}' testfile

Em segundo lugar, grep encontrará uma correspondência mínima, é fácil assim, por isso, combinaremos com 3 ou 4 corridas de x em uma execução mais longa de x s. Para evitar isso, algum tipo de condição de contorno será necessário para não corresponder a um subconjunto de uma execução mais longa. Um grep com suporte a PCRE pode usar lookarounds de largura zero para conseguir isso:

(echo xxx; echo xxxxxx) | grep -P '(?<!x)xxx(?!x)'
    
por 12.09.2015 / 02:59