Jag vill veta vilka filer som har strängen $Id$
.
grep \$Id\$ my_dir/mylist_of_files
returnerar 0 förekomster.
Jag upptäckte att jag måste använda
grep \$Id$ my_dir/mylist_of_files
Då ser jag att $Id
är färgad i utgången, dvs den har matchats.
Hur kunde jag matcha andra $
och varför fungerar inte t \$Id\$
.
Det spelar ingen roll om den andra $
är det sista tecknet eller inte.
Jag använder grep
2.9.
Innan jag lade upp min fråga, jag använde google …
För att söka efter ett $ (dollartecken) i filen med namnet test2, skriv in:
grep \\ $ test2
Tecknen \\ (dubbel backslash) är nödvändiga för att tvinga skalet att passera en \ $ (enkel backslash, dollartecken) till grep-kommandot. Tecknet \ (enkel backslash) berättar grep-kommandot att behandla följande tecken (i detta exempel $) som ett bokstavligt tecken snarare än ett uttryckstecken. Använd kommandot fgrep för att undvika behovet av att använda escape-tecken som bakåtvänd snedstreck.
men jag förstår inte varför grep \$Id
fungerar och varför grep \\$Id\\$
inte gör det.
Jag ”är lite förvirrad …
Svara
Det finns två separata nummer här.
-
grep
använder Grundläggande reguljära uttryck (BRE) och$
är ett specialtecken i BRE ”s bara i slutet av ett uttryck. Konsekvensen av detta är att de två instanserna av$
i$Id$
inte är lika. den första är en normal karaktär och den andra är ett ankare som matchar slutet på raden. För att den andra$
ska matcha en bokstavlig$
du ”måste backslash undkomma det, dvs$Id\$
. Att fly från den första$
fungerar också:\$Id\$
, och jag föredrar det eftersom det ser mer konsekvent ut. ¹ -
Det finns två helt orelaterade flykt- / citeringsmekanismer som fungerar här: skalcitationstecken och regex-backstegcitering. Problemet är att många tecken som reguljära uttryck använder är speciella för skalet, och dessutom är regex escape-karaktären, backslash, också ett skal som citerar karaktär. Det är därför du ofta ser röra med dubbla bakåtvända snedstreck, men jag rekommenderar inte att du använder bakåtvända snedstreck för att citera regelbundna uttryck eftersom det inte är särskilt läsbart. hela regex inuti enstaka citat som i
"regex"
. Det enda citatet är den starkaste formen av att citera skalet, så länge din regex inte innehåller enstaka citat behöver du inte längre oroa dig för skalcitering och kan fokusera på ren BRE-syntax.
Så, tillämpa detta till ditt ursprungliga exempel, låt oss kasta rätt regex (\$Id\$
) inuti enstaka citat. Följande ska göra vad du vill:
grep "\$Id\$" my_dir/my_file
Anledningen till att \$Id\$
inte beror på att borttagning av skalcitat (det rätta sättet att säga skal citerande) tillämpas, den regex som grep
ser är $Id$
. Som förklaras i (1.) matchar denna regex en bokstavlig $Id
bara i slutet av en rad eftersom den första $
är bokstavlig medan den andra är ett speciellt ankartecken.
¹ Observera också att om du någonsin byter till Extended Regular Expressions (ERE), t.ex. om du bestämde dig för att använda egrep
(eller grep -E
), $
är alltid speciellt. I ERE skulle ”s $Id$
aldrig matcha någonting eftersom du inte kan ha tecken efter slutet på en rad, så \$Id\$
är det enda sättet att gå.
Kommentarer
Svar
För att söka $Id$
i en fil: du kan använda: grep "\$id*" filename
Kommentarer
- Att matchar allt som börjar med
$id
, så till exempel$idea
, inte bara$id$
.
grep -F '$Id$'
.grep '$Id\$' ...
ochgrep \$Id\\$ ...
arbete$
med en föregående$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284