Megpróbálom megérteni a különbséget grep -e
és grep -E
. Most grep manpage
-től kaptam:
-E, –extended-regexp
Értelmezze a PATTERN-t kiterjesztett reguláris kifejezésként (lásd alább).
-e PATTERN, –regexp = PATTERN
A PATTERN-t használja mintaként; hasznos a –
mintákkal védeni – a fenti magyarázat nekem nincs értelme.
Tehát meg tudja magyarázni valaki nekem a examples
használatával mi a különbség a kettő között, és mikor melyik opciót kell használni.
PS: Verzió: grep (GNU grep) 2.10
Megjegyzések
Válasz
-e
szigorúan az a zászló, amely jelzi azt a mintát, amellyel egyeztetni szeretne. A -E
vezérli, hogy el kell-e menekülnie bizonyos speciális karakterek elől.
man grep
elmagyarázza a -E
még egy kicsit:
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.
megjegyzések
- tehát ez az oka, amikor Teszek
echo "hello" | grep -o -e 'h|l'
nem kapok kimenetet, mert a|
elvesztette különleges jelentését, és amikor énecho "hello" | grep -o -E 'h|l'
Megkapom a kívánt kimenetet. - Igen. A
echo "hello" | grep -o -e 'h' -e 'l'
akkor működik, ha ebben az esetben el akarja dobni a-E
-t. - szó szerint
h|l
, míg agrep -e -o 'h\|l'
h
vagyl
és -E-vel ' s az ellenkezője - @ronnie it ' s sajnálatos, hogy legalább 200 hírnévre van szükséged ahhoz, hogy az " funkció " az SE webhelyek között kövessen …
Válasz
Szintén grep -e
lehetővé teszi több karakterlánc használatát a kereséshez: "grep -e "abc" -e "def" -e "123"
a következő három karakter bármelyikét megkeresi: abc
, valamint def
és 123
.
Ez egészen hasonlóan működik, mint grep "abc\|def\|123"
, ahol \|
áll mert or
, de c kissé tisztábban kellene olvasni.
Mivel a grep -E
legfontosabb tényei itt már kifejtésre kerültek, csak annyit szeretnék hozzáadni, amit összefoglaltam ebben a témában egy egészen hasonló kérdésre: Rendszeres kifejezés kettős karakterek kereséséhez a Bash-ban
Válasz
lásd alább
/ kiterjesztett
A grep a reguláris kifejezés szintaxisának három különböző változatát érti: „alap”, „kibővített” és „perl”. A GNU grep-ben nincs különbség az elérhető funkciók között az alapszintű és a kiterjesztett szintaxisok között. Más megvalósításokban az alapvető reguláris kifejezések kevésbé hatékonyak. Az alábbi leírás kiterjesztett reguláris kifejezésekre vonatkozik; Az alapszabályos kifejezések különbségeit utólag foglaljuk össze. A Perl reguláris kifejezések további funkcionalitást biztosítanak, és a pcresyntax (3) és a pcrepattern (3) dokumentációban vannak, de nem biztos, hogy minden rendszerben elérhetők.
Tehát , még egyszer.
A GNU grep-ben nincs különbség az alapvető és a kiterjesztett szintaxisok közötti rendelkezésre álló funkcionalitásban.
Megjegyzések
- a funkcionalitás ugyanaz az alap és a kiterjesztett között, de a szintaxis kissé eltér. Az olyan speciális karaktereket, mint
(
,)
,|
stb., a különleges jelentéssel bírnak az alapvető regexp-ben, de nem kiterjesztve (ahol meg kell kerülni őket, hogy karakterláncként kezeljék őket)
Válasz
Csak a -e
opció részletezéséhez. A -e
gyakran nem kötelező:
grep PATTERN
azonos a
grep -e PATTERN
hacsak – amint azt egy korábbi Válasz és a man oldalak megemlítik – több keresési minta van, vagy ha kötőjellel (-) kezdődő mintát akarunk védeni.
-e
célja valójában csak az, hogy egyértelművé tegye, amikor a regex egy kötőjellel kezdődik. Tehátgrep ---foo
adunrecognized option: ---foo
, de mondhatja azt, hogygrep -e ---foo
megkapja a---foo
.