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.