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 …

Jeg fant et svar

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.

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

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

  • For å unngå grep å tolke sin første parameter som et vanlig uttrykk , kan du også gjøre grep -F '$Id$'.
  • I skallet mitt (bash 4.3.42) grep '$Id\$' ... og grep \$Id\\$ ... arbeid
  • Og hvis dette er en kommando i en makefile, må du også unnslippe $ med en forrige $: grep '$$Id\$$'. stackoverflow.no / a / 2382810/2097284

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *