Como uso o operador padrão regular {m, n} no grep?

6

Eu tenho um arquivo de texto, do qual eu preciso selecionar apenas essas linhas, que incluem a string "tt". Então eu tentei isso na linha de comando:

grep "t{2}" textfile

Allthough eu sei que o textfile contém palavras como "podre" "lixo" o comando grep não mostra linhas, mas o status de saída é 1.

Eu tentei outro padrão regular:

grep "a.*x" textfile

para este funciona.

    
por Abdul Al Hazred 14.02.2015 / 14:19

3 respostas

14

Por padrão, o grep usa Expressões regulares básicas , você precisa escapar das chaves para fazer o grep corresponder a vários caracteres:

grep 't\{2\}' textfile

Como alternativa, você pode usar a opção -E (ou a opção -P para o GNU grep , que usa Expressões regulares compatíveis com Perl ) fazendo grep use Expressões regulares extensas , que podem usar chaves sem escapar:

grep -E 't{2}'
    
por 14.02.2015 / 14:26
7

Você precisa escapar das chaves:

grep 't\{2\}' textfile

Caso contrário, { e } são tratados como caracteres literais.

    
por 14.02.2015 / 14:22
7

Você precisa usar a opção -E ( --extended-regexp ) ou -P ( --perl-regexp ) (com o GNU grep).

De acordo com a página do manual do GNU grep (1) sobre Expressões regulares estendidas versus básicas , ou seja, se você optar por não usar estas opções:

In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

    
por 14.02.2015 / 14:23