Jeg vil vite hvilke filer som har strengen $Id$
.
grep \$Id\$ my_dir/mylist_of_files
returnerer 0 forekomster.
Jeg oppdaget at jeg må bruke
grep \$Id$ my_dir/mylist_of_files
Så ser jeg at $Id
er farget i utgangen, dvs. at den har blitt matchet.
Hvordan kunne jeg matche andre $
og hvorfor virker ikke t \$Id\$
.
Det spiller ingen rolle om det andre $
er det siste tegnet eller ikke.
Jeg bruker grep
2.9.
Før la ut spørsmålet mitt, jeg brukte google …
Hvis du vil søke etter et $ (dollartegn) i filen som heter test2, skriver du inn:
grep \\ $ test2
\\ (dobbel tilbakeslag) er nødvendige for å tvinge skallet til å passere en $ (enkelt tilbakeslag, dollartegn) til grep-kommandoen. Tegnet \ (enkelt tilbakeslag) forteller kommandoen grep å behandle følgende tegn (i dette eksemplet $) som et bokstavelig tegn i stedet for et uttrykk. Bruk kommandoen fgrep for å unngå nødvendigheten av å bruke rømningstegn som tilbakeslag.
men jeg forstår ikke hvorfor grep \$Id
fungerer og hvorfor grep \\$Id\\$
ikke «t.
Jeg» er litt forvirret …
Svar
Det er to separate utgaver her.
-
grep
bruker Basic Regular Expressions (BRE), og$
er et spesialtegn i BRE «er bare på slutten av et uttrykk. Konsekvensen av dette er at de to forekomstene av$
i$Id$
ikke er like. den første er en normal karakter og den andre er et anker som samsvarer med slutten av linjen. For å gjøre det andre$
matche en bokstavelig$
du «må tilbakeslå unnslippe den, dvs.$Id\$
. Å unnslippe den første$
fungerer også:\$Id\$
, og jeg foretrekker dette siden det ser mer konsistent ut. ¹ -
Det er to helt urelaterte rømnings- / siteringsmekanismer som virker her: shell-sitering og regex-tilbakeslag. Problemet er at mange tegn som vanlige uttrykk bruker er spesielle for skallet også, og på toppen av det er regex escape-karakteren, backslash, også et skall som siterer karakter. Dette er grunnen til at du ofte ser rot som involverer dobbel tilbakeslag, men jeg anbefaler ikke å bruke tilbakeslag for å sitere regelmessige uttrykk fordi det ikke er veldig lesbart.
I stedet er den enkleste måten å gjøre dette på først å sette hele regex inne i enkle anførselstegn som i
"regex"
. Enkelt sitatet er den sterkeste formen for å sitere skallet, så så lenge regexet ditt ikke inneholder enkelt anførselstegn, trenger du ikke lenger å bekymre deg for skallsitering og kan fokusere på ren BRE-syntaks.
Så bruk dette på det opprinnelige eksemplet, la oss kaste riktig regex (\$Id\$
) i enkle anførselstegn. Følgende skal gjøre det du vil:
grep "\$Id\$" my_dir/my_file
Årsaken til at \$Id\$
ikke er fordi etter fjerning av skallsitat (den mer korrekte måten å si skall på sitering) brukes, regex som grep
ser er $Id$
. Som forklart i (1.), samsvarer denne regexen med en bokstavelig $Id
bare på slutten av en linje fordi den første $
er bokstavelig, mens den andre er et spesielt ankertegn.
¹ Vær også oppmerksom på at hvis du noen gang bytter til utvidede regulære uttrykk (ERE), for eksempel hvis du bestemte deg for å bruke egrep
(eller grep -E
), $
-tegnet er alltid spesielt. I ERE vil «s $Id$
aldri matche noe fordi du ikke kan ha tegn etter slutten av en linje, så \$Id\$
ville være den eneste veien å gå.
Kommentarer
Svar
For å søke $Id$
i en fil: du kan bruke: grep "\$id*" filename
Kommentarer
- At vil matche alt som starter med
$id
, så$idea
for eksempel også, ikke bare$id$
.
grep -F '$Id$'
.grep '$Id\$' ...
oggrep \$Id\\$ ...
arbeid$
med en forrige$
:grep '$$Id\$$'
. stackoverflow.no / a / 2382810/2097284