Szeretném tudni, mely fájlokban található a $Id$
karakterlánc.
A
grep \$Id\$ my_dir/mylist_of_files
0 előfordulást ad vissza.
Rájöttem, hogy használnom kell
grep \$Id$ my_dir/mylist_of_files
Ekkor látom, hogy a $Id
színű a kimenetben, azaz megfeleltetésre került.
Hogyan illeszthetem a második $
és miért nem működik “t \$Id\$
.
Nem számít, hogy a második $
az utolsó karakter, vagy sem.
A grep
2.9-et használom.
Előtte kérdésem feltöltésekor a Google-t használtam …
$ (dollárjel) kereséséhez a test2 nevű fájlban írja be:
grep \\ $ test2
A \\ (kettős visszavonás) karaktereket szükségesek ahhoz, hogy a héjat átengedjék egy \ $ -nak (egyszeri visszavonás, dollárjel) a grep parancsra. Az \ (single backslash) karakter megmondja a grep parancsnak, hogy a következő karaktert (ebben a példában a $) szó szerinti karakterként kezelje, nem pedig kifejezés karakterként. Az fgrep paranccsal elkerülheti az olyan menekülési karakterek használatát, mint a visszavágás.
de nem értem, miért grep \$Id
működik, és miért grep \\$Id\\$
nem “t”.
Kicsit zavarodott vagyok …
Válasz
Itt két külön probléma van.
-
grep
Alapvető reguláris kifejezéseket (BRE) használ, az$
pedig a BRE speciális karaktere “s csak egy kifejezés végén. Ennek az a következménye, hogy a$
két példánya a$Id$
csoportban nem egyenlő. az első egy normál karakter, a második pedig egy horgony, amely megegyezik a sor végével. Ahhoz, hogy a második$
megfeleljen egy literál$
vissza kell vágnod a perjelet, azaz$Id\$
. Az első$
menekülése szintén működik:\$Id\$
, és ezt jobban szeretem, mivel következetesebbnek tűnik.¹ -
Két teljesen független menekülési / idézőjelző mechanizmus működik itt: a héj idézet és a regex visszavágó idézet. A probléma sok olyan karakter, amelyet a reguláris kifejezések használnak, különlegesek a shell számára is, ráadásul a regex escape karakter, a visszavágó is héj idéző karakter. Éppen ezért gyakran lát kettős visszavágással járó rendetlenségeket, de nem javaslom a visszavonások használatát a rendszeres kifejezések idézésében a shellben, mert ez nem túl olvasható.
Ehelyett a legegyszerűbb módszer az, ha először a teljes regex egyetlen idézőjelben, mint a
"regex"
részben. Az egyetlen idézet a legerősebb formája a héj idézésének, így mindaddig, amíg a regex nem tartalmaz egyetlen idézetet, addig már nem kell aggódnia a shell idézése miatt, és a tiszta BRE szintaxisra koncentrálhat.
Tehát ezt alkalmazva az eredeti példára, dobjuk a helyes regexet (\$Id\$
) egyetlen idézőjelbe. A következőknek azt kell tenniük, amit akarnak:
grep "\$Id\$" my_dir/my_file
A (z) \$Id\$
oka nem működik, mert a héj idézet eltávolítása után (a shell helyes mondásának módja) idézi) alkalmazzák, az grep
látott regex $Id$
. Amint az (1.) -ben kifejtettük, ez a regex megegyezik egy literal $Id
csak a sor végén, mert az első $
szó szerinti, míg a második egy speciális horgony karakter.
¹ Ne feledje azt is, hogy ha valaha is kiterjesztett reguláris kifejezésekre (ERE) vált, pl. ha a (vagy grep -E
), az $
karakter mindig különleges. Az ERE-ben “s $Id$
soha nem egyezik semmivel, mert nem lehetnek karakterek a sor vége után , tehát \$Id\$
az egyetlen járható út.
Megjegyzések
Válasz
A kereséshez $Id$
egy fájlban: használhatja: grep "\$id*" filename
megjegyzéseket
- mindenhez illeszkedik, amely a
$id
kezdetű, tehát például$idea
is, nem csak a$id$
.
grep -F '$Id$'
műveleteket is.grep '$Id\$' ...
ésgrep \$Id\\$ ...
munka$
elől is egy megelőző$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284