Jeg vil gerne vide, hvilke filer der har strengen $Id$.

grep \$Id\$ my_dir/mylist_of_files 

returnerer 0 forekomster.

Jeg opdagede, at jeg skal bruge

grep \$Id$ my_dir/mylist_of_files

Så ser jeg, at $Id er farvet i output, dvs. at den er blevet matchet.

Hvordan kunne jeg matche andet $ og hvorfor fungerer ikke t \$Id\$.

Det betyder ikke noget, om det andet $ er det sidste tegn eller ej.

Jeg bruger grep 2.9.


Før når jeg stillede mit spørgsmål, brugte jeg google …

Jeg fandt et svar

For at søge efter et $ (dollartegn) i filen med navnet test2, skal du indtaste:

grep \\ $ test2

\\ (dobbelt backslash) tegn er nødvendige for at tvinge skallen til at passere en $ (enkelt tilbageslag, dollartegn) til grep-kommandoen. Tegnet \ (single backslash) fortæller grep-kommandoen at behandle følgende tegn (i dette eksempel $) som et bogstaveligt tegn snarere end et udtrykskarakter. Brug kommandoen fgrep for at undgå nødvendigheden af at bruge flugttegn som f.eks. Tilbageslag.

men jeg forstår ikke hvorfor grep \$Id fungerer, og hvorfor grep \\$Id\\$ ikke “t.

Jeg” er lidt forvirret …

Svar

Der er 2 separate udgaver her.

  1. grep bruger Grundlæggende regulære udtryk (BRE), og $ er et specielt tegn i BRE “er kun i slutningen af et udtryk. Konsekvensen af dette er, at de to forekomster af $ i $Id$ ikke er ens. den første er en normal karakter, og den anden er et anker, der matcher slutningen af linjen. For at få det andet $ til at matche en bogstavelig $ du “skal backslash undslippe det, dvs. $Id\$. At undslippe den første $ fungerer også: \$Id\$, og jeg foretrækker dette, da det ser mere konsekvent ud. ¹

  2. Der er to fuldstændigt uafhængige undslipnings- / citeringsmekanismer, der fungerer her: shellcitering og regex-tilbagevendende citat. Problemet er, at mange tegn, som regulære udtryk bruger, også er specielle for skallen, og derudover er regex-escape-karakteren, backslash, også en shell-citerende karakter. Dette er grunden til, at du ofte ser rod, der involverer dobbelte tilbageslag, men jeg anbefaler ikke at bruge tilbageslag til shell, der citerer regelmæssige udtryk, fordi det ikke er meget læsbart. hele regex inde i enkelte citater som i "regex". Enkelt citatet er den stærkeste form for at citere skallen, så så længe din regex ikke indeholder enkelt citater, behøver du ikke længere bekymre dig om skal citere og kan fokusere på ren BRE-syntaks.

Så anvend dette tilbage til dit originale eksempel, lad os kaste den rigtige regex (\$Id\$) inde i enkelte citater. Følgende skal gøre, hvad du vil:

grep "\$Id\$" my_dir/my_file 

Årsagen \$Id\$ virker ikke, fordi fjernelse af shell-tilbud (den mere korrekte måde at sige shell på citerende) anvendes, regex, som grep ser, er $Id$. Som forklaret i (1.) svarer denne regex til en bogstavelig $Id kun i slutningen af en linje, fordi den første $ er bogstavelig, mens den anden er et specielt ankertegn.

¹ Bemærk også, at hvis du nogensinde skifter til Extended Regular Expressions (ERE), f.eks. hvis du besluttede at bruge egrep (eller grep -E), tegnet $ er altid specielt. I ERE ville s $Id$ aldrig matche noget, fordi du ikke kan have tegn efter slutningen af en linje, så \$Id\$ ville være den eneste vej at gå.

Kommentarer

  • For at undgå grep fortolker dens 1. parameter som et regulært udtryk , kan du også gøre grep -F '$Id$'.
  • I min shell (bash 4.3.42) grep '$Id\$' ... og grep \$Id\\$ ... arbejde
  • Og hvis dette er en kommando i en makefile, skal du også undslippe $ med en foregående $: grep '$$Id\$$'. stackoverflow.com / a / 2382810/2097284

Svar

For at søge $Id$ i en fil: du kan bruge: grep "\$id*" filename

Kommentarer

  • At vil matche alt, der starter med $id, så $idea for eksempel også, ikke bare $id$ .

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *