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 …

Jag hittade ett svar

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.

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

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

  • För att undvika grep tolkar dess första parameter som ett reguljärt uttryck , du kan också göra grep -F '$Id$'.
  • I mitt skal (bash 4.3.42) grep '$Id\$' ... och grep \$Id\\$ ... arbete
  • Och om detta är ett kommando i en makefil, måste du också undkomma $ med en föregående $: grep '$$Id\$$'. stackoverflow.com / a / 2382810/2097284

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *