Observo o seguinte comportamento grep
ao executá-lo cinco vezes:
me@asus:~/go/src/company/topology-front$ lsof |grep 'READ'
vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp
me@asus:~/go/src/company/topology-front$ lsof |grep 'README.md*'
vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp
me@asus:~/go/src/company/topology-front$ lsof |grep 'README.md'
vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp
me@asus:~/go/src/company/topology-front$ lsof |grep '*README.md*'
me@asus:~/go/src/company/topology-front$ lsof |grep '*README.md'
me@asus:~/go/src/company/topology-front$
Não consegui entender porque as duas últimas tentativas de grep
não estão retornando nenhum resultado.
grep
padrões são expressões regulares (também conhecidas como regex, regexp, RE), expressões regulares básicas (BRE), a menos que uma das opções-E
/-F
/-P
/-K
/-X
(somente as duas primeiras sendo padrão) seja usada.*
é um operador regexp que corresponde a 0 ou mais do átomo anterior . Por exemplo,d*
corresponde a 0 ou maisd
s. Em BREs, quando no início do padrão ou ao seguir os operadores^
ou\(
regexp, corresponde*
apenas a um literal (também é interpretado literalmente dentro de[...]
expressões de colchetes).So
grep '*README.md*'
corresponde em linhas que contêm um literal*
seguido porREADME
seguido por qualquer caractere único (o.
operador regexp) seguido porm
seguido por qualquer número ded
s. Como qualquer número inclui 0, isso é funcionalmente equivalente agrep '*README.m'
(o que não faria diferença em quais linhas estão sendo correspondidas, apenas no que pode ser correspondido dentro da linha (o que seria exibido com a--color
opção do GNUgrep
, por exemplo)).Por exemplo, corresponderia nessas 2 linhas:
(o
^
s mostrando o que dentro da linha corresponde à expressão regular, que você pode ver com--color
)Aqui, parece que você está confundindo expressões regulares com padrões de curinga de shell. O
*
operador curinga que corresponde a 0 ou mais caracteres pode ser escrito.*
em expressões regulares. Mas fazendo:novamente seria o mesmo que:
As
grep
procura por uma correspondência dentro da linha em vez de encontrar linhas que correspondam exatamente ao padrão (para o qual você precisa-x
).Com ast-open
grep
, que tambémksh93
égrep
embutido (nem sempre embutido por padrão, e você precisa ativá-lo colocando/opt/ast/bin
à frente de$PATH
), você pode usar a-K
opção paragrep
usar curingas de shell (ksh93 estendidos). Então, com essagrep
implementação, você pode fazer:ou
para corresponder em linhas que contêm
README.md
.Com essa mesma implementação, a correspondência curinga também pode ser habilitada em expressões regulares estendidas (
-E
), aumentadas (-X
) ou semelhantes a perl (-P
) com o(?K)
operador (e\(?K\)
em expressões regulares básicas que realmente quebram a conformidade POSIX, então eu não confiaria nisso pois pode ser removido em uma versão futura). Então você pode fazer:lá.
Com qualquer
grep
implementação moderna, você também pode fazer:Para uma pesquisa de string fixa (onde
.
acima corresponde a um literal.
em vez de qualquer caractere).