encontrando o padrão (ab) * usando grep

-1
grep ab* filename.txt

O comando acima encontra linhas que começam com a e terminam com qualquer número de b . Por exemplo:

a
ab
abb
abb

Mas como corrijo meu comando para encontrar linhas como essas?

ab
abab
abababab

Eu tentei grep (ab)* filename.txt , mas não será porque é igual a (ab | (ab) | (ab)) .

    
por Mint.K 27.01.2017 / 04:44

2 respostas

4

% bl0ck_qu0te%

Não, não funcionará porque () é especial para a maioria dos shells e você receberá um erro de sintaxe:

$ grep (ab)* foo
bash: syntax error near unexpected token '('

Cite suas expressões.

Agora, grep usa Basic Regular Expressions (BRE) por padrão. Para agrupar parte de uma expressão no BRE, você precisa usar \(...\) :

$ echo xababx | grep -o '\(ab\)*'
abab

Ou use expressões regulares estendidas (ERE) ou expressões regulares compatíveis com Perl (PCRE), em que (...) é suficiente:

$ echo abab | grep -Eo '(ab)*'
abab
$ echo abab | grep -Po '(ab)*'
abab

Consulte o grep manual para BRE vs ERE .

    
por muru 27.01.2017 / 05:45
0
$ more ~/tmp/test_grep.txt
ab
abab
abababab
abaab
aba

$ grep -e '^\(ab\)\+$' ~/tmp/test_grep.txt
ab
abab
abababab

-e opção é usar expressão regular. A expressão é ^(ab)+$ pela qual o ^ começa no início da linha, o + diz para repetir o grupo (ab) e o $ diz para finalizar após (ab) .

    
por PT Huynh 27.01.2017 / 05:46