O único arquivo no meu diretório de trabalho atual é chamado test.txt
e seu conteúdo é simplesmente:
This is a little test file.
- Executando
não dá nenhuma partida .grep -in * -e 'te.?t file'
- Mas escapar
?
funciona:
dá partidagrep -in * -e 'te.\?t file'
Louco: Com a estrela *
, as coisas são ao contrário!
- Sem escapar:
dá partidagrep -in * -e 'te.*t file'
- e escapar
*
não funciona:
nenhuma partidagrep -in * -e 'te.\*t file'
Por que os metacaracteres ?
e são *
tratados de forma diferente em relação ao escape?
Esta é simplesmente a especificação de sintaxe usada por
grep
. Sem nenhuma flag adicional, (GNU)grep
usa Basic Regular Expressions , que requer que alguns metacaracteres (em sua forma pura (1) , chaves) sejam escapados. Veja também agrep
página de manual:Isso significa que no modo BRE,
?
deve ser escapado se for para ser tratado como um metacaractere, enquanto o mesmo não é verdade para*
. Para um comportamento mais "intuitivo", você pode querer mudargrep
para o modo Extended Regular Expression (ERE):(1) Note que
\|
,\+
e\?
no modo BRE são na verdade extensões não-padrão, mas são suportadas pelo GNU e Busyboxgrep
(e possivelmente outros). Veja também a resposta de Eli Minkoff .Em uma observação adicional, conforme sugerido por @Kusalananda,
sed
pode ajudar na depuração do RegExp:grep
usa Basic Regular Expressions por padrão, que são um dialeto mais limitado, que não suporta operadores?
or+
. Asgrep
implementações GNU e FreeBSD os suportam se escapados de barra invertida, mas isso não é padrão. Se você quiser que o grep use Extended Regular Expressions, que são um dialeto mais moderno que os suporta, você pode invocá-lo com o-E
sinalizador:Ou, com GNU grep especificamente,