Încerc să înțeleg diferența dintre grep -e
și grep -E
. Acum de la grep manpage
am primit:
-E, –extended-regexp
Interpretează PATTERN ca o expresie regulată extinsă (vezi mai jos).
-e PATTERN, –regexp = PATTERN
Folosește PATTERN ca model; util pentru a proteja tiparele care încep cu –
Explicația de mai sus nu are sens pentru mine.
Deci, poate cineva să o explice eu folosind examples
care este diferența dintre cele două și când se folosește opțiunea.
PS: Versiune: grep (GNU grep) 2.10
Comentarii
Răspuns
-e
este strict steagul pentru indicarea modelului cu care doriți să se potrivească. -E
controlează dacă trebuie să scapi de anumite caractere speciale.
man grep
explică -E
este un pic mai mult:
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.
Comentarii
- deci acesta este motivul pentru care Nu
echo "hello" | grep -o -e 'h|l'
nu primesc nici o ieșire, deoarece|
și-a pierdut semnificația specială și cândecho "hello" | grep -o -E 'h|l'
Obțin rezultatul dorit. - Da.
echo "hello" | grep -o -e 'h' -e 'l'
va funcționa dacă doriți să aruncați-E
în acest caz. -
grep -e -o 'h|l'
se va potrivi literalmenteh|l
în timp cegrep -e -o 'h\|l'
se va potrivi cuh
saul
și cu -E ' este dimpotrivă - @ronnie it ' nefericit că ai nevoie de peste 200 de reputații pentru ca această funcție " " să te urmeze între site-urile SE …
Răspuns
De asemenea, grep -e
permite utilizarea mai multor șiruri pentru căutare: "grep -e "abc" -e "def" -e "123"
va căuta oricare dintre aceste trei șiruri: abc
, precum și def
și 123
.
Acest lucru funcționează destul de similar cu grep "abc\|def\|123"
unde \|
pentru or
dar c Ar trebui să fie puțin mai clar de citit.
Deoarece cele mai importante fapte de pe grep -E
sunt deja explicate aici, vreau doar să adaug ceea ce am rezumat pe acest subiect la o întrebare destul de similară: Expresie regulată pentru găsirea de caractere duble în Bash
Răspuns
vezi mai jos
/ extins
grep înțelege trei versiuni diferite ale sintaxei expresiei regulate: „de bază”, „extins” și „perl”. În GNU grep, nu există nicio diferență în funcționalitatea disponibilă între sintaxele de bază și cele extinse. În alte implementări, expresiile regulate de bază sunt mai puțin puternice. Următoarea descriere se aplică expresiilor regulate extinse; diferențele pentru expresiile regulate de bază sunt rezumate ulterior. Expresiile regulate Perl oferă funcționalități suplimentare și sunt documentate în pcresyntax (3) și pcrepattern (3), dar este posibil să nu fie disponibile pe fiecare sistem.
Deci , încă o dată.
În GNU grep, nu există nicio diferență în funcționalitatea disponibilă între sintaxele de bază și cele extinse
Comentarii
- funcționalitatea este aceeași între de bază și extins, dar sintaxa este ușor diferită. regexp caractere speciale precum
(
,)
,|
etc. trebuie să fie scăpate în au semnificația lor specială în regexp de bază, dar nu și în extins (unde trebuie scăpați pentru a fi tratați ca un șir literal)
Răspuns
Doar pentru a detalia opțiunea -e
. -e
este adesea opțional:
grep PATTERN
este identic cu
grep -e PATTERN
cu excepția cazului în care, așa cum sa menționat într-un răspuns anterior și în paginile manual, există mai multe modele de căutare sau pentru a proteja un model care începe cu o cratimă (-).
-e
este într-adevăr doar să dezambiguizeze atunci când o regex începe cu o liniuță. Deci,grep ---foo
oferăunrecognized option: ---foo
, dar puteți spunegrep -e ---foo
la grep pentru expresia regulată---foo
.