Caracteres curinga para caminhos de arquivos não estão funcionando no grep [duplicado]

3

Eu preciso de palavras grep como estas:

ABC-DEF
AB2-DEF
AB3-DEF
AB-DEF

Então eu estava tentando:

grep AB*-DEF
grep -w -AB*-DEF
grep -w AB*DEF

Mas nenhum deles está funcionando.

    
por GP92 13.05.2015 / 16:41

4 respostas

12

* em um regex não é como um nome de arquivo glob. Significa 0 ou mais do caractere / padrão anterior. Assim, seus exemplos estariam procurando por A , em seguida, 0 ou mais B , em seguida, -DEF

. in regex significa "qualquer caractere" para que você possa corrigir seu padrão usando

grep 'AB.*DEF'
    
por 13.05.2015 / 16:46
3

No que diz respeito aos seus padrões, isso seria o mais seguro para corresponder apenas as sequências pretendidas:

grep 'AB.\{0,1\}-DEF' file.txt

Ou

grep -E 'AB.?-DEF' file.txt

. corresponde a qualquer caractere único, ? e \{0,1\} correspondem ao token anterior zero ou uma vez, portanto, no total .? e .\{0,1\} corresponderão a zero ou um caractere antes de -DEF .

Se você usar AB.*-DEF ou AB.*DEF , grep corresponderá avidamente a sequências indesejadas, por exemplo:

ABCG-DEF
ABCGLHHJKH90-DEF
    
por 13.05.2015 / 16:50
1

Você pode usar:

grep 'AB.*-DEF' file.txt
    
por 13.05.2015 / 16:46
0

Os curingas em suas expressões regulares são expandidos pelo shell. O shell trata-os como metacaracteres de nomes de arquivos. Então, você tem que dizer ao shell para não avaliá-los como metacaracteres de nomes e você faz isso citando-os usando aspas simples, aspas duplas ou caractere de barra invertida antes do metacaractere. Em seguida, o shell envia a expressão como tal para o utilitário grep , que manipula a expressão regular.

    
por 13.05.2015 / 17:51