Quero saber quais arquivos têm a string $Id$
.
grep \$Id\$ my_dir/mylist_of_files
retorna 0 ocorrências.
Descobri que preciso usar
grep \$Id$ my_dir/mylist_of_files
Então vejo que $Id
está colorido na saída, ou seja, foi correspondido.
Como eu poderia combinar o segundo $
e por que “t \$Id\$
funciona.
Não importa se o segundo $
é o último caractere ou não.
Eu uso grep
2.9.
Antes postando minha pergunta, usei o google …
Para pesquisar um $ (cifrão) no arquivo chamado test2, digite:
grep \\ $ test2
Os caracteres \\ (barra invertida dupla) são necessários para forçar o shell a passar um \ $ (única barra invertida, cifrão) para o comando grep. O caractere \ (barra invertida única) diz ao comando grep para tratar o caractere a seguir (neste exemplo, $) como um caractere literal em vez de um caractere de expressão. Use o comando fgrep para evitar a necessidade de usar caracteres de escape, como a barra invertida.
mas não entendo por que grep \$Id
funciona e por que grep \\$Id\\$
não.
Estou um pouco confuso …
Resposta
Existem 2 questões distintas aqui.
-
grep
usa Expressões regulares básicas (BRE) e$
é um caractere especial em BRE “s apenas no final de uma expressão. A consequência disso é que as 2 instâncias de$
em$Id$
não são iguais. o primeiro é um caractere normal e o segundo é uma âncora que corresponde ao final da linha. Para fazer o segundo$
corresponder a um literal$
você terá que fazer um escape com barra invertida, ou seja,$Id\$
. Escapar do primeiro$
também funciona:\$Id\$
, e eu prefiro isso porque parece mais consistente.¹ -
Existem dois mecanismos de escape / cotação completamente não relacionados em funcionamento aqui: cotação de shell e cotação de barra invertida regex. O problema é que muitos caracteres que as expressões regulares usam também são especiais para o shell e, além disso, o caractere de escape do regex, a barra invertida, também é um caractere de citação do shell. É por isso que você costuma ver bagunças envolvendo barras invertidas duplas, mas eu não recomendo o uso de barras invertidas para expressões regulares de shell, porque não é muito legível.
Em vez disso, a maneira mais simples de fazer isso é primeiro colocar seu regex inteiro entre aspas simples como em
"regex"
. As aspas simples são a forma mais forte de citação que o shell tem, portanto, desde que sua regex não contenha aspas simples, você não precisa mais se preocupar com aspas do shell e pode se concentrar na sintaxe BRE pura.
Então, aplicando isso de volta ao seu exemplo original, vamos colocar o regex correto (\$Id\$
) entre aspas simples. O seguinte deve fazer o que você deseja:
grep "\$Id\$" my_dir/my_file
A razão \$Id\$
não funcionar é porque após a remoção das citações do shell (a maneira mais correta de dizer shell entre aspas) é aplicada, a regex que grep
vê é $Id$
. Conforme explicado em (1.), esta regex corresponde a um $Id
apenas no final de uma linha porque o primeiro $
é literal, enquanto o segundo é um caractere âncora especial.
¹ Observe também que se você mudar para Expressões regulares estendidas (ERE), por exemplo, se você decidir usar egrep
(ou grep -E
), o caractere $
é sempre especial. Em ERE “s $Id$
nunca corresponderia a nada porque você não pode” ter caracteres após o final de uma linha, então \$Id\$
seria o único caminho a percorrer.
Comentários
Resposta
Para pesquisar $Id$
em um arquivo: você pode usar: grep "\$id*" filename
Comentários
- Isso corresponderá a qualquer coisa começando com
$id
, então$idea
por exemplo também, não apenas$id$
.
grep -F '$Id$'
.grep '$Id\$' ...
egrep \$Id\\$ ...
work$
com um$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284