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 …
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.
-
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. ¹ -
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
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$
.
grep -F '$Id$'
.grep '$Id\$' ...
oggrep \$Id\\$ ...
arbejde$
med en foregående$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284