Voglio sapere quali file hanno la stringa $Id$.

grep \$Id\$ my_dir/mylist_of_files 

restituisce 0 occorrenze.

Ho scoperto che devo usare

grep \$Id$ my_dir/mylist_of_files

Quindi vedo che $Id è colorato nelloutput, cioè è stato trovato.

Come posso abbinare il secondo $ e perché “t \$Id\$ funziona.

Non importa se il secondo $ è o meno lultimo carattere.

Uso grep 2.9.


Prima postando la mia domanda, ho usato google …

ho trovato una risposta

Per cercare un $ (segno di dollaro) nel file denominato test2, inserisci:

grep \\ $ test2

I caratteri \\ (doppia barra rovesciata) sono necessari per forzare la shell a passare un \ $ (singola barra rovesciata, segno di dollaro) al comando grep. Il carattere \ (singola barra rovesciata) indica al comando grep di trattare il carattere seguente (in questo esempio $) come un carattere letterale piuttosto che come un carattere di espressione. Utilizza il comando fgrep per evitare la necessità di utilizzare caratteri di escape come la barra rovesciata.

ma non “capisco perché grep \$Id funziona e perché grep \\$Id\\$ non “t.

Sono un po confuso …

Risposta

Ci sono due problemi separati qui.

  1. grep utilizza Espressioni regolari di base (BRE) e $ è un carattere speciale in BRE “è solo alla fine di unespressione. La conseguenza di ciò è che le 2 istanze di $ in $Id$ non sono uguali. il primo è un carattere normale e il secondo è unancora che corrisponde alla fine della riga. Per fare in modo che il secondo $ corrisponda a un $ dovrai uscire dalla barra rovesciata, ovvero $Id\$. Lescape del primo $ funziona anche: \$Id\$ e preferisco questo perché sembra più coerente.¹

  2. Ci sono due meccanismi di escaping / quoting completamente indipendenti al lavoro qui: quoting di shell e quoting con barra rovesciata regex. Il problema è che molti caratteri utilizzati dalle espressioni regolari sono anche speciali per la shell, e per di più il carattere di escape regex, il backslash, è anche un carattere di citazione della shell. Questo è il motivo per cui spesso si vedono pasticci che coinvolgono doppi backslash, ma non consiglio di usare backslash per la citazione di espressioni regolari di shell perché non è molto leggibile.

    Invece, il modo più semplice per farlo è mettere prima il tuo intera espressione regolare allinterno di virgolette singole come in "regex". La virgoletta singola è la forma più forte di citazione della shell, quindi finché la tua regex non contiene virgolette singole, non devi più preoccuparti delle virgolette della shell e puoi concentrarti sulla pura sintassi BRE.

Quindi, applicando questo di nuovo al tuo esempio originale, lanciamo la corretta espressione regolare (\$Id\$) tra virgolette singole. Quanto segue dovrebbe fare quello che vuoi:

grep "\$Id\$" my_dir/my_file 

Il motivo \$Id\$ non funziona è perché dopo la rimozione delle virgolette di shell (il modo più corretto di dire shell quoting), la regex che grep vede è $Id$. Come spiegato in (1.), questa regex corrisponde a un letterale $Id solo alla fine di una riga perché il primo $ è letterale mentre il secondo è un carattere di ancoraggio speciale.

¹ Nota anche che se mai passassi alle espressioni regolari estese (ERE), ad esempio se decidessi di utilizzare egrep (o grep -E), il carattere $ è sempre speciale. In ERE “s $Id$ non corrisponderebbe mai a nulla perché” non puoi avere caratteri dopo la fine di una riga, quindi \$Id\$ sarebbe lunica strada da percorrere.

Commenti

  • Per evitare che grep interpreti il suo primo parametro come unespressione regolare , puoi anche eseguire grep -F '$Id$'.
  • Nella mia shell (bash 4.3.42) grep '$Id\$' ... e grep \$Id\\$ ... work
  • E se questo è un comando in un makefile, devi anche eseguire lescape di $ con un $: grep '$$Id\$$'. stackoverflow.com / a / 2382810/2097284

Risposta

Per cercare $Id$ in un file: puoi usare: grep "\$id*" filename

Commenti

  • Quello corrisponderà a tutto ciò che inizia con $id, quindi anche $idea ad esempio, non solo $id$ .

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *