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
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 doeecho "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 meth|l
terwijlgrep -e -o 'h\|l'
overeenkomt meth
ofl
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 (-).
-e
is eigenlijk alleen om ondubbelzinnig te maken wanneer een regex begint met een streepje. Dusgrep ---foo
geeftunrecognized option: ---foo
maar je kuntgrep -e ---foo
zeggen tegen grep voor de reguliere expressie---foo
.