Ik wil zoeken naar regels die een van de volgende tekens bevatten:

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

Antwoord

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

Binnen een expressie tussen haakjes, [...], zijn er heel weinig tekens ” speciaal ” (slechts een zeer kleine subset, zoals ], - en ^, en de drie combinaties [=, [: en [.). Bij het opnemen van ] in [...], moet ] eerst komen (mogelijk na een ^). Ik heb ervoor gekozen om de ] eerst te plaatsen en de [ laatste voor symmetrie.

Het enige andere dat je moet onthouden is dat een enkele tekenreeks tussen aanhalingstekens geen enkel aanhalingsteken kan bevatten, dus gebruiken we dubbele aanhalingstekens rond de uitdrukking. Omdat we een string met dubbele aanhalingstekens gebruiken, zal de shell erin rondneuzen om dingen uit te breiden. Om deze reden ontsnappen we aan de $ als \$ waardoor de shell een letterlijke $ naar grep, en we ontsnappen aan ! als \! omdat het een geschiedenis is uitbreiding in bash (alleen in interactieve bash shells).

Zou je een backslash willen opnemen in de set, zou je het moeten escapen als \\ zodat de shell een enkele backslash geeft aan grep. Ook als je wilt opnemen een backtick `, het moet ook worden geëscaped als \` aangezien het anders een commando-vervanging start.

Het commando hierboven zou elke regel extraheren die ten minste een van de tekens in de uitdrukking tussen haakjes bevat.


Het gebruik van een enkele tekenreeks tussen aanhalingstekens in plaats van een dubbele tekenreeks tussen aanhalingstekens, die de meeste ergernissen met welke karakters de shell interpreteert:

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

Hier is het enige dat je moet onthouden, afgezien van de plaatsing van de ], is dat een enkele tekenreeks tussen aanhalingstekens geen enkel aanhalingsteken kan bevatten, dus in plaats daarvan gebruiken we een aaneenschakeling van drie tekenreeksen:

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

Een andere benadering zou zijn om de POSIX-tekenklasse [[:punct:]] te gebruiken. Dit komt overeen met een enkel teken uit de set !"#$%&"()*+,-./:;<=>?@[\]^_`{|}~, die een grotere set is dan wat in de vraag wordt gegeven (het bevat bovendien "-.<>^_`{|}~), maar bestaat uit alle ” leestekens ” die POSIX definieert.

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

Reacties

  • @ilkkachu Ik heb ‘ de $ daarin! Bedankt!
  • Wanneer ik het commando probeer uit te voeren, krijg ik deze foutmelding bash: !\: event not found.
  • @ user9371654 Verdorie bash! 🙂 Ontsnap ook aan de ! … Ik ben geen bash gebruiker Dat ben ik vergeten. Ik zal updaten …
  • "[\!]" breidt uit naar [\!] zelfs als geschiedenisuitbreiding is ingeschakeld, zou dit dus overeenkomen met backslash. U ‘ hebt enkele aanhalingstekens nodig of gebruikt \! outsi de aanhalingstekens.
  • Merk op dat het ‘ niet alleen bash, zsh heeft ook die vervelende eigenschap die is overgenomen van csh. in csh, ! speciaal binnen '...' ook, en ook wanneer niet-interactief. In csh (in tegenstelling tot bash of zsh) zou het gebruik van "\!" hier echter werken (de backslash is verwijderd).

Antwoord

U kunt [:punct:] tekenklasse gebruiken als u vind het niet erg dat het ook overeenkomt met andere interpunctie en speciale tekens:

grep "[[:punct:]]" file 

Opmerkingen

  • De punct character class (niet macro) komt overeen met !"#$%&'()*+,-./:;<=>?@[\]^_ {|} ~ `in de C-landinstelling, wat een iets grotere reeks tekens is dan wat de gebruiker heeft, maar het kan goed genoeg zijn.

Antwoord

U kunt volledige regex gebruiken om te zoeken speciale tekens tussen vierkante haken als u op zoek bent naar een teken dat een speciaal teken is. Een geweldige bron voor het oefenen, leren en controleren van uw reguliere expressie is regex101.com .

Dit gebruikt reguliere Perl-expressies, die kunnen worden gebruikt met GNU grep met de -P optie:

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

Merk op dat je twee backsl as voor het dollarteken, omdat het een speciale betekenis heeft in de schaal, en de eerste backslash zal eraan ontsnappen voor de schaal. (Met slechts één backslash vooraan zou de shell de backslash verwijderen, grep zou een dollarteken zonder escapecodes zien dat het einde van de regel betekent, en overeenkomt met elke invoerregel.)

Als je terminal kleuren ondersteunt, gooi dan ook kleuren aan,

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

Hier is de uitleg van mijn regex van 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) 

Reacties

  • Nee, met standaard ERE kun je ‘ ontsnappen aan het sluiten ] met backslash. backslash is geen speciale expressie tussen haakjes. Om een ] binnen een expressie tussen haakjes te hebben, moet deze eerst []other] zijn, niet [ot\]her]. Dat ‘ verschilt van PCREs die regex101 standaard beschrijft.
  • Het zou werken met pcregrep of GNU grep -P, echter. En in zekere zin is het gedrag van Perl eenvoudiger: een backslash maakt een speciaal teken altijd normaal.
  • Gecorrigeerd naar -P, sorry daarvoor, ik krijg de -E en -P door elkaar

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *