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 …

Encontrei uma resposta

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.

  1. 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.¹

  2. 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

  • Para evitar que o grep interprete seu primeiro parâmetro como uma expressão regular , você também pode fazer grep -F '$Id$'.
  • No meu shell (bash 4.3.42) grep '$Id\$' ... e grep \$Id\\$ ... work
  • E se este for um comando em um makefile, você também deve escapar o $ com um $: grep '$$Id\$$'. stackoverflow.com / a / 2382810/2097284

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$ .

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *