usando intervalos de repetição {} com grep [closed]

-1
$ grep a{2,} alphabet.txt
grep: a: No such file or directory
$cat alphabet.txt
abcdefghijklnmopqrstuvwxyz

Meu alfabeto.txt contém uma linha com a até z. Um {2} não significa corresponder aaa *? No entanto, o grep nem está funcionando.

    
por Mint.K 27.01.2017 / 06:22

1 resposta

6

Escape seu padrão Regex para evitar a interpretação de shell de antemão.

Você usou o padrão a{2,} , sem nenhum escape, pois esse é um padrão válido de expansão de bash brace que está sendo expandido em bash as a2 a .

Então, eventualmente, o que grep recebe é:

grep a2 a alphabet.txt

Como o arquivo a não existe, daí o erro em relação a ele.

Apenas escape do padrão usando qualquer uma das maneiras usuais:

grep 'a{2,}' alphabet.txt
grep "a{2,}" alphabet.txt
grep a\{2,\} alphabet.txt

Aqui, é aconselhável usar as aspas simples, a menos que você tenha uma variável que deseja expandir - nesse caso, use aspas duplas. Tente evitar que a barra invertida escape, pois isso pode distorcer os padrões e torná-los ilegíveis. ao escapar de tokens ERE (Extended Regular Expression) dentro do BRE (Basic Regular Expression); onde você precisará (blackslash) escapar duas vezes para fazer o motor tratá-los como tokens ERE.

Mesmo agora, as chaves seriam tratadas literalmente porque grep , por padrão, usa o mecanismo BRE, enquanto o intervalo correspondente a {} é, na verdade, um token ERE. Então você pode usar a opção -E para tratar o padrão como ERE:

grep -E 'a{2,}' alphabet.txt

Ou escape das chaves dentro do BRE:

grep 'a\{2,\}' alphabet.txt

Como observação, seu arquivo de entrada não contém dois ou mais a , portanto o padrão a{2,} nunca corresponderá à entrada atual.

    
por heemayl 27.01.2017 / 06:29