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 …
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.
-
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ä.¹ -
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
Vastaa
Hakuun $Id$
tiedostossa: voit käyttää: grep "\$id*" filename
kommentteja
- sopii mihin tahansa, joka alkaa
$id
, joten esimerkiksi$idea
, ei vain$id$
.
grep -F '$Id$'
.grep '$Id\$' ...
jagrep \$Id\\$ ...
toimi$
edeltävän$
:grep '$$Id\$$'
. pinonkulku.com / a / 2382810/2097284