Jeg prøver å forstå forskjellen mellom grep -e
og grep -E
. Nå fra grep manpage
fikk jeg:
-E, –extended-regexp
Tolk MØNSTER som et utvidet regulært uttrykk (se nedenfor).
-e MØNSTER, –regexp = MØNSTER
Bruk MØNSTER som mønster; nyttig for å beskytte mønstre som begynner med –
Forklaringen ovenfor gir ikke mening for meg.
Så, kan noen forklare det for jeg bruker examples
hva er forskjellen mellom de to og når jeg skal bruke hvilket alternativ.
PS: Versjon: grep (GNU grep) 2.10
Kommentarer
Svar
-e
er strengt tatt flagget for å indikere mønsteret du vil matche mot. -E
styrer om du trenger å unnslippe visse spesialtegn.
man grep
forklarer -E
det litt mer:
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.
Kommentarer
- så dette er grunnen når Jeg gjør
echo "hello" | grep -o -e 'h|l'
Jeg får ingen utdata fordi|
mistet sin spesielle betydning, og når jeg gjørecho "hello" | grep -o -E 'h|l'
Jeg får ønsket utdata. - Ja.
echo "hello" | grep -o -e 'h' -e 'l'
fungerer hvis du vil kaste-E
i dette tilfellet. -
grep -e -o 'h|l'
samsvarer bokstavelig medh|l
mensgrep -e -o 'h\|l'
samsvarer medh
ellerl
og med -E det ' er det motsatte - @ronnie it ' s uheldig, du trenger mer enn 200 omdømme for å ha at " -funksjonen " følger deg mellom SE-nettsteder …
Svar
Også grep -e
lar deg bruke flere strenger for å søke: "grep -e "abc" -e "def" -e "123"
vil se etter noen av de tre av disse strengene: abc
samt def
og 123
.
Dette fungerer ganske likt grep "abc\|def\|123"
der \|
for or
men c burde være litt tydeligere å lese.
Ettersom de viktigste fakta om grep -E
allerede er forklart her, vil jeg bare legge til det jeg oppsummerte om dette emnet på et ganske likt spørsmål: Regulært uttrykk for å finne dobbelttegn i Bash
Svar
se nedenfor
/ utvidet
grep forstår tre forskjellige versjoner av syntaks for vanlig uttrykk: “basic”, “utvidet” og “perl.” I GNU grep er det ingen forskjell i tilgjengelig funksjonalitet mellom grunnleggende og utvidede syntakser. I andre implementeringer er grunnleggende regulære uttrykk mindre kraftige. Følgende beskrivelse gjelder utvidede regulære uttrykk; forskjeller for grunnleggende regulære uttrykk er oppsummert etterpå. Perl-regulære uttrykk gir ekstra funksjonalitet, og er dokumentert i pcresyntax (3) og pcrepattern (3), men er kanskje ikke tilgjengelig på alle systemer.
Så , nok en gang.
I GNU grep er det ingen forskjell i tilgjengelig funksjonalitet mellom grunnleggende og utvidede syntakser
Kommentarer
- funksjonaliteten er den samme mellom grunnleggende og utvidet, men syntaksen er litt annerledes. regexp spesielle tegn som
(
,)
,|
osv. må slippes i tilbakeslag har sin spesielle betydning i grunnleggende regexp, men ikke i utvidet (der de må rømmes for å bli behandlet som en streng bokstavelig)
Svar
Bare for å utdype alternativet -e
. -e
er ofte valgfritt:
grep PATTERN
er identisk med
grep -e PATTERN
med mindre det, som nevnt i et tidligere svar og på mansidene, er flere søkemønstre, eller for å beskytte et mønster som begynner med en bindestrek (-).
-e
er egentlig bare å gjøre det entydig når en regex starter med en bindestrek. Sågrep ---foo
girunrecognized option: ---foo
men du kan sigrep -e ---foo
for å grep for det regulære uttrykket---foo
.