grep - exclui uma string que não é uma substring de uma string

4

Eu explico meu problema no Ubuntu 16.04 com o seguinte exemplo: O arquivo é:

# cat file
aaa
aaaxxx
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx

Eu quero exibir todas as linhas que contêm aaa , mas não somente na combinação somente de aaaxxx . Eu quero uma saída como esta:

# grep SOMETHING-HERE file …
aaa
aaaxxx*aaa (second aaa is the hit)
aaa=aaaxxx (first aaa is the hit)
bbbaaaccc (aaa in any other combination but not aaaxxx)
aaaddd/aaaxxx (similar to above)

Eu tentei coisas como grep -v aaaxxx file | grep aaa , que resulta:

aaa
bbbaaaccc

ou

# egrep -P '(?<!aaaxxx )aaa' file
grep: die angegebenen Suchmuster stehen in Konflikt zueinander (the pattern are in contradiction)

Existe alguma possibilidade (simples)? Claro que não precisa ser grep . Obrigado

    
por musbach 03.11.2016 / 20:59

1 resposta

6

É simples usar um operador lookahead no estilo perl - disponível no modo Peripheral Regular Expression (PCRE) do grep usando a opção -P :

$ grep -P 'aaa(?!xxx)' file
aaa
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx

(a formatação em negrito na saída indica as partes correspondidas realçadas por grep )

Embora o lookahead de comprimento zero seja conveniente, você pode obter a mesma saída usando a sintaxe Expressão Regular Estendida (ERE) do GNU, por exemplo, combinando aaa seguido por até 2 x caracteres seguido por um não x character ou end-of-line ie

grep -E 'aaax{0,2}([^x]|$)' file

ou mesmo usando a sintaxe da expressão regular básica (BRE) do GNU

grep 'aaax\{0,2\}\([^x]\|$\)' file

que correspondem como

aaa
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx
    
por steeldriver 03.11.2016 / 21:04