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 …
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.
-
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.¹ -
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
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$
.
grep -F '$Id$'
.grep '$Id\$' ...
egrep \$Id\\$ ...
work$
con un$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284