Ik wil weten welke bestanden de tekenreeks $Id$
hebben.
grep \$Id\$ my_dir/mylist_of_files
retourneert 0 instanties.
Ik ontdekte dat ik
grep \$Id$ my_dir/mylist_of_files
Dan zie ik dat de $Id
gekleurd is in de output, dat wil zeggen dat er een match is.
Hoe kan ik de second $
en waarom “t \$Id\$
niet werkt.
Het maakt niet uit of de tweede $
is het laatste teken of niet.
Ik gebruik grep
2.9.
Voor bij het plaatsen van mijn vraag heb ik google gebruikt …
Om te zoeken naar een $ (dollarteken) in het bestand met de naam test2, typt u:
grep \\ $ test2
De \\ (dubbele backslash) tekens zijn nodig om de shell te dwingen een \ $ (enkele backslash, dollarteken) door te geven naar het grep commando. Het \ (enkele backslash) -teken vertelt het grep-commando om het volgende teken (in dit voorbeeld de $) als een letterlijk teken te behandelen in plaats van als een expressieteken. Gebruik de opdracht fgrep om de noodzaak van het gebruik van escape-tekens, zoals de backslash, te vermijden.
maar ik begrijp niet waarom grep \$Id
werkt en waarom grep \\$Id\\$
niet “t.
Ik” ben een beetje in de war …
Antwoord
Er zijn hier 2 afzonderlijke problemen.
-
grep
gebruikt Basic Regular Expressions (BRE), en$
is een speciaal teken in BRE “s alleen aan het einde van een uitdrukking. Het gevolg hiervan is dat de 2 instanties van$
in$Id$
niet gelijk zijn. De de eerste is een normaal teken en de tweede is een anker dat overeenkomt met het einde van de regel. Om ervoor te zorgen dat de tweede$
overeenkomt met een letterlijke$
je zult moeten backslashen om eraan te ontsnappen, dwz$Id\$
. Ontsnappen aan de eerste$
werkt ook:\$Id\$
, en ik geef hier de voorkeur aan omdat het er consistenter uitziet.¹ -
Er zijn hier twee volledig niet-gerelateerde ontsnappings- / citeermechanismen aan het werk: shell-aanhalingstekens en regex-backslash-aanhalingstekens. Het probleem is dat veel tekens die reguliere expressies gebruiken ook speciaal zijn voor de shell, en bovendien is het regex-escape-teken, de backslash, ook een shell-aanhalingsteken. Dit is de reden waarom je vaak rotzooi ziet met dubbele backslashes, maar ik raad het gebruik van backslashes af voor shell die reguliere expressies aanhaalt, omdat het niet erg leesbaar is.
In plaats daarvan is de eenvoudigste manier om dit te doen eerst je volledige regex tussen enkele aanhalingstekens zoals in
"regex"
. Het enkele aanhalingsteken is de sterkste vorm van citeren die de shell heeft, dus zolang uw regex geen enkele aanhalingstekens bevat, hoeft u zich geen zorgen meer te maken over shell-citaten en kunt u zich concentreren op pure BRE-syntaxis.
Dus, als we dit terug toepassen op uw oorspronkelijke voorbeeld, laten we “de juiste regex (\$Id\$
) tussen enkele aanhalingstekens plaatsen. Het volgende zou moeten doen wat u wilt:
grep "\$Id\$" my_dir/my_file
De reden dat \$Id\$
niet werkt, is omdat na het verwijderen van de shell-quote (de correctere manier om shell citaat) wordt toegepast, is de regex die grep
ziet $Id$
. Zoals uitgelegd in (1.), komt deze regex overeen met een letterlijke $Id
alleen aan het einde van een regel omdat de eerste $
letterlijk is, terwijl de tweede een speciaal ankerteken is.
¹ Merk ook op dat als je ooit overschakelt naar Extended Regular Expressions (ERE), bijvoorbeeld als je besluit (of grep -E
), het $
-teken is altijd speciaal. In ERE “s $Id$
zou nooit iets overeenkomen omdat je” geen tekens na het einde van een regel mag hebben, dus \$Id\$
zou de enige manier zijn om te gaan.
Reacties
Antwoord
Zoeken naar $Id$
in een bestand: je kunt gebruiken: grep "\$id*" filename
Opmerkingen
- Dat komt overeen met alles dat begint met
$id
, dus$idea
bijvoorbeeld ook, niet alleen$id$
.
grep -F '$Id$'
doen.grep '$Id\$' ...
engrep \$Id\\$ ...
werk$
met een voorafgaande$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284