É 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