Ik probeer het verschil te begrijpen tussen grep -e en grep -E. Nu van grep manpage heb ik:

-E, –extended-regexp

Interpreteer PATTERN als een uitgebreide reguliere expressie (zie hieronder).

-e PATTERN, –regexp = PATTERN

Gebruik PATTERN als het patroon; handig om patronen te beschermen die beginnen met –

De bovenstaande uitleg is voor mij niet logisch.

Dus, kan iemand het uitleggen aan ik gebruik examples wat is het verschil tussen de twee en wanneer welke optie te gebruiken.

PS: Versie: grep (GNU grep) 2.10

Reacties

  • Zie ook: unix.stackexchange.com/questions/17949/…
  • Het doel van -e is eigenlijk alleen om ondubbelzinnig te maken wanneer een regex begint met een streepje. Dus grep ---foo geeft unrecognized option: ---foo maar je kunt grep -e ---foo zeggen tegen grep voor de reguliere expressie ---foo.

Antwoord

-e is strikt de vlag om het patroon aan te geven waarmee u wilt matchen. -E bepaalt of u bepaalde speciale tekens moet escapen.

man grep legt uit -E het een beetje meer:

 Basic vs Extended Regular Expressions In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \). Traditional egrep did not support the { meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a literal {. GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification. For example, the command grep -E "{1" searches for the two-character string {1 instead of reporting a syntax error in the regular expression. POSIX.2 allows this behavior as an extension, but portable scripts should avoid it. 

Reacties

  • dus dit is de reden waarom Ik echo "hello" | grep -o -e 'h|l' Ik krijg geen uitvoer omdat | zijn speciale betekenis heeft verloren en wanneer ik dat doe echo "hello" | grep -o -E 'h|l' Ik krijg de gewenste output.
  • Ja. echo "hello" | grep -o -e 'h' -e 'l' werkt als je in dit geval de -E weg wilt gooien.
  • grep -e -o 'h|l' komt letterlijk overeen met h|l terwijl grep -e -o 'h\|l' overeenkomt met h of l en met -E it ' is het tegendeel
  • @ronnie it ' jammer dat je 200+ reputatie nodig hebt om die " functie " je te laten volgen tussen SE-sites …

Answer

Ook grep -e maakt het mogelijk om verschillende strings te gebruiken om te zoeken: "grep -e "abc" -e "def" -e "123" zal zoeken naar een van de drie van deze strings: abc evenals def en 123.

Dit werkt ongeveer hetzelfde als grep "abc\|def\|123" waar \| staat voor or maar c zou wat duidelijker moeten zijn om te lezen.

Aangezien de belangrijkste feiten over grep -E hier al zijn uitgelegd, wil ik gewoon toevoegen wat ik over dit onderwerp heb samengevat op een vrij vergelijkbare vraag: Reguliere expressie voor het vinden van dubbele tekens in Bash

Antwoord

zie hieronder

/ extended

grep begrijpt drie verschillende versies van de syntaxis van reguliere expressies: “basic”, “extended” en “perl.” In GNU grep is er geen verschil in beschikbare functionaliteit tussen basis- en uitgebreide syntaxis. In andere implementaties zijn reguliere reguliere expressies minder krachtig. De volgende beschrijving is van toepassing op uitgebreide reguliere expressies; verschillen voor reguliere reguliere expressies worden achteraf samengevat. Perl reguliere expressies bieden extra functionaliteit en zijn gedocumenteerd in pcresyntax (3) en pcrepattern (3), maar zijn mogelijk niet op elk systeem beschikbaar.

Dus , nogmaals.

In GNU grep is er geen verschil in beschikbare functionaliteit tussen basis- en uitgebreide syntaxis

Reacties

  • de functionaliteit is hetzelfde tussen basis en uitgebreid, maar de syntaxis is iets anders. regexp speciale tekens zoals (, ), | enz. moeten worden backslash-escaped naar hebben hun speciale betekenis in basisregexp, maar niet in extended (waar ze moeten worden ontsnapt om als letterlijke tekenreeks te worden behandeld)

Answer

Om de -e optie uit te werken. -e is vaak optioneel:

grep PATTERN 

is identiek aan

grep -e PATTERN 

tenzij, zoals vermeld in een eerder antwoord en in de man-paginas, er meerdere zoekpatronen zijn, of om een patroon te beschermen dat begint met een koppelteken (-).

Geef een reactie

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