Haluan tietää, millä tiedostoilla on merkkijono $Id$.

grep \$Id\$ my_dir/mylist_of_files 

palauttaa 0 esiintymää.

Huomasin, että minun on käytettävä

grep \$Id$ my_dir/mylist_of_files

Sitten huomaan, että $Id on tulosteen värillinen, ts. se on sovitettu yhteen.

Kuinka voin sovittaa toinen $ ja miksi ”t \$Id\$ ei toimi.

Sillä ei ole väliä, jos toinen $ on viimeinen merkki tai ei.

Käytän grep 2.9.


Ennen lähetin kysymykseni, käytin googlea …

Löysin vastauksen

Jos haluat etsiä $ (dollarin merkki) tiedostosta test2, kirjoita:

grep \\ $ test2

\\ (kaksoisviiva) merkit ovat välttämättömiä pakotettaessa kuori siirtämään \ $ (yksi taaksepäin viiva, dollarin merkki) grep-komentoon. \ (Yksi taaksepäin viiva) -merkki käskee grep-komennon käsittelemään seuraavaa merkkiä (tässä esimerkissä $) kirjaimellisena merkkinä lausekkeen sijaan. Käytä fgrep-komentoa välttääksesi välttämättömyyden käyttää pakomerkkejä, kuten kääntösuunta.

mutta en ymmärrä miksi grep \$Id toimii ja miksi grep \\$Id\\$ ei ”t”.

Olen hieman hämmentynyt …

Vastaa

Tässä on kaksi erillistä ongelmaa.

  1. grep käyttää Säännölliset perustiedot (BRE) ja $ on BRE: n erikoismerkki ”s vain lausekkeen lopussa. Tämän seurauksena on, että $ -tietokannan $Id$ -kappaleet eivät ole yhtä suuret. ensimmäinen on normaali merkki ja toinen on ankkuri, joka vastaa rivin loppua. Jotta toinen $ sopisi literaaliin $ Sinun on vältettävä siitä vinoviiva, ts. $Id\$. Ensimmäisen $ -toiminnon välttäminen toimii myös: \$Id\$, ja pidän tästä parempana, koska se näyttää yhtenäisemmältä.¹

  2. Tässä toiminnassa on kaksi täysin toisistaan riippumatonta pakenemis- / lainausmekanismia: kuorilainaaminen ja regex-käänteinen lainausmerkki. Ongelma on monissa tavallisten lausekkeiden käyttämissä merkeissä, jotka ovat erityisiä myös kuorelle, ja lisäksi regex-pakomerkki, käänteinen viiva, on myös kuorilainaava merkki. Siksi näet usein sekaisin kaksoisviivoja, mutta en suosittele kääntöviivojen käyttöä kuoressa säännöllisten lausekkeiden lainaamisessa, koska se ei ole kovin luettavissa.

    Sen sijaan yksinkertaisin tapa tehdä tämä on laittaa ensin koko regex lainausmerkkien sisällä, kuten "regex". Yksittäinen lainaus on vahvin muoto kuoren lainaamisesta, joten niin kauan kuin regex-lauseesi ei sisällä yksittäisiä lainausmerkkejä, sinun ei tarvitse enää huolehtia kuoren lainaamisesta ja voit keskittyä puhtaaseen BRE-syntaksiin.

Joten, soveltamalla tätä takaisin alkuperäiseen esimerkkiin, heitämme oikean regexin (\$Id\$) lainausmerkkien sisään. Seuraavien tulisi tehdä mitä haluat:

grep "\$Id\$" my_dir/my_file 

Syy \$Id\$ ei toimi, koska kuorilainauksen poistamisen jälkeen (oikeampi tapa sanoa kuori lainausmerkkiä), grep näkevä regex on $Id$. Kuten kohdassa (1.) on selitetty, tämä regex vastaa kirjaimellista $Id vain rivin lopussa, koska ensimmäinen $ on kirjaimellinen, kun taas toinen on erityinen ankkurimerkki.

¹ Huomaa myös, että jos vaihdat koskaan laajennettuihin säännöllisiin lausekkeisiin (ERE), esimerkiksi jos päätit käyttää egrep (tai grep -E), merkki $ on aina erityinen. ERE: ssä ”s $Id$ ei koskaan sovi mihinkään, koska merkkejä ei voi olla rivin lopun jälkeen , joten \$Id\$ olisi ainoa tapa edetä.

Kommentit

  • Vältetään grep: n tulkitsevan sen 1. parametria säännöllisenä lausekkeena. , voit myös tehdä grep -F '$Id$'.
  • Shellissani (bash 4.3.42) grep '$Id\$' ... ja grep \$Id\\$ ... toimi
  • Ja jos tämä on komento makefailissa, sinun on myös vältettävä $ edeltävän $: grep '$$Id\$$'. pinonkulku.com / a / 2382810/2097284

Vastaa

Hakuun $Id$ tiedostossa: voit käyttää: grep "\$id*" filename

kommentteja

  • sopii mihin tahansa, joka alkaa $id, joten esimerkiksi $idea, ei vain $id$ .

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *