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 …

választ talá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.

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

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

  • Annak elkerülése érdekében, hogy a grep az első paraméterét reguláris kifejezésként értelmezze , megteheti a grep -F '$Id$' műveleteket is.
  • A héjban (bash 4.3.42) grep '$Id\$' ... és grep \$Id\\$ ... munka
  • És ha ez egy parancs egy makefile-ben, akkor el kell menekülnie a $ elől is egy megelőző $: grep '$$Id\$$'. stackoverflow.com / a / 2382810/2097284

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük