Haluan etsiä rivejä, jotka sisältävät minkä tahansa seuraavista merkeistä:

: / / ? # [ ] @ ! $ & " ( ) * + , ; = %

Vastaa

grep "[]:/?#@\!\$&"()*+,;=%[]" 

Suluissa olevassa lausekkeessa [...] vain harvat merkit ovat ” special ” (vain hyvin pieni osajoukko, kuten ], - ja ^ ja kolme yhdistelmää [=, [: ja [.). Kun sisällytetään ] ryhmään [...], ] on oltava ensin (mahdollisesti ^). Päätin asettaa ] ensin ja [ symmetrian viimeiseksi.

Ainoa muista asia on että yksittäinen lainattu merkkijono ei voi sisältää yhtä lainausta, joten käytämme lausekkeen ympärillä kaksoislainauksia. Koska käytämme kaksinkertaista lainausmerkkijonoa, kuori työntää sitä ympärille, jotta asiat laajenevat. Tästä syystä pakenemme $ nimellä \$, mikä saa kuoren kirjaimellisesti $grep, ja me pääsemme !: ksi myös \! koska se on ”historia” laajennus bash (kuitenkin vain vuorovaikutteisissa bash -kuorissa).

Haluatko sisällyttää takaviivan asetettu, sinun on vältettävä se nimellä \\, jotta kuori antaa yhden taaksepäin viivan grep. Jos haluat myös sisällyttää backtick `, myös se täytyy välttää nimellä \`, koska se aloittaa komennon muuten.

Komento Yllä oleva poimi kaikki rivit, jotka sisälsivät vähintään yhden merkistä sulkeissa olevaan lausekkeeseen.


Yksittäisen lainausmerkkijonon käyttäminen kaksoislainatun merkkijonon sijaan, joka kiertää suurimman osan häirinnöistä mitä merkkejä kuori tulkitsee:

grep "[]:/?#@!$&"""""()*+,;=%[]" 

Tässä on ainoa muistettava asia lukuun ottamatta ] on, että yksi lainattu merkkijono ei voi sisältää yhtä lainausta, joten sen sijaan käytämme kolmen merkkijonon ketjutusta:

  1. "[]:/?#@!$&"
  2. """
  3. "()*+,;=%[]"

Toinen lähestymistapa olisi käyttää POSIX-merkkiluokkaa [[:punct:]]. Tämä vastaa yhtä merkkiä joukosta !"#$%&"()*+,-./:;<=>?@[\]^_`{|}~, joka on suurempi joukko kuin mitä kysymyksessä annetaan (se sisältää lisäksi "-.<>^_`{|}~), mutta kaikki POSIXin määrittelemät ” välimerkit ”.

LC_ALL=C grep "[[:punct:]]" 

Kommentit

  • @ilkkachu en huomannut ’ huomannut $ siellä! Kiitos!
  • Kun yritän suorittaa komennon, saan tämän virheen bash: !\: event not found.
  • @ user9371654 Darn bash! 🙂 Pakene myös ! … Ei ole bash käyttäjä unohdin sen. Päivitän …
  • "[\!]" laajenee muotoon [\!] vaikka historialaajennus olisi käytössä, se sopisi myös taaksepäin. ’ Tarvitset yksittäisiä lainausmerkkejä tai \! outsi de lainausmerkit.
  • Huomaa, että se ’ ei ole vain bash, zsh on myös se ärsyttävä ominaisuus, joka on peritty csh: ltä. myös csh: ssä ! erityinen '...' sisällä ja myös silloin, kun se ei ole vuorovaikutteinen. csh -kohdassa (toisin kuin bash tai zsh) kuitenkin "\!" -toiminto toimisi tässä (taaksepäin oleva viiva poistetaan).

vastaus

Voit käyttää [:punct:] -merkkiluokkaa, jos Älä muista, että se vastaa myös muita välimerkkejä ja erikoismerkkejä:

grep "[[:punct:]]" file 

Kommentit

  • punct merkkiluokka (ei makro) vastaa !"#$%&'()*+,-./:;<=>?@[\]^_ {|} ~ `C-kielessä, joka on hieman suurempi merkistöjoukko kuin mitä käyttäjällä on, mutta se voi olla tarpeeksi hyvä.

Vastaa

Voit etsiä täyden regexin avulla erikoismerkit hakasulkeissa, jos etsit yhtä erikoismerkkiä. Hieno resurssi säännöllisen lausekkeen harjoittamiseen, oppimiseen ja tarkistamiseen on regex101.com .

Tämä käyttää Perlin säännöllisiä lausekkeita, joita voidaan käyttää GNU grep: n kanssa -P -vaihtoehdon kanssa:

grep -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])" ^^^ 

Huomaa, että tarvitset kaksi taaksepäin tuhka dollarin merkin edessä, koska sillä on erityinen merkitys kuoressa, ja ensimmäinen taaksepäin viiva pakenee siitä kuorelle. (Vain yksi taaksepäin viiva edessä, kuori poistaisi käänteisen viivan, grep näyttäisi väistämättömän dollarin merkin, joka tarkoittaa rivin loppua, ja vastaa mitä tahansa syöttöriviä.)

Jos pääte tukee värejä, heittäkää myös värit päälle.

grep --color=auto -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])" 

Tässä on selitys regexilleni hakemistosta regex101.com

/(\:|\/|\?|\#|\@|\!|\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])/gm 1st Capturing Group (\:|\/|\?|\#|\@|\!|\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\]) \: matches the character : literally (case sensitive) \/ matches the character / literally (case sensitive) \? matches the character ? literally (case sensitive) \# matches the character # literally (case sensitive) \@ matches the character @ literally (case sensitive) \! matches the character ! literally (case sensitive) \$ matches the character $ literally (case sensitive) \& matches the character & literally (case sensitive) \" matches the character " literally (case sensitive) \( matches the character ( literally (case sensitive) \) matches the character ) literally (case sensitive) \* matches the character * literally (case sensitive) \+ matches the character + literally (case sensitive) \, matches the character , literally (case sensitive) \; matches the character ; literally (case sensitive) \= matches the character = literally (case sensitive) \% matches the character % literally (case sensitive) \[ matches the character [ literally (case sensitive) \] matches the character ] literally (case sensitive) 

kommentit

  • Ei, tavallisella ERE-toiminnolla voit ’ ei paeta sulkemisesta ] taaksepäin. Backslash ei ole erityinen suluissa. Jotta ] olisi hakasulkeessa, sen on oltava ensimmäinen: []other], ei [ot\]her]. Tämä ’ eroaa PCRE-tiedostoista, jotka regex101 kuvaa oletusarvoisesti.
  • Se toimii pcregrep tai GNU grep -P. Ja tavallaan Perlin käyttäytyminen on suoraviivaisempaa: taaksepäin viiva tekee erikoismerkistä aina normaalin.
  • Korjattu arvoksi -P, anteeksi siitä, sekoitan -E ja -P sekaisin

Vastaa

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