Jeg prøver at forstå forskellen mellem grep -e
og grep -E
. Nu fra grep manpage
fik jeg:
-E, –extended-regexp
Fortolk MØNSTER som et udvidet regulært udtryk (se nedenfor).
-e MØNSTER, –regexp = MØNSTER
Brug MØNSTER som mønster; nyttigt at beskytte mønstre, der begynder med –
Ovenstående forklaring giver ikke mening for mig.
Så kan nogen forklare det for mig ved hjælp af examples
hvad er forskellen mellem de to og hvornår de skal bruge hvilken mulighed.
PS: Version: grep (GNU grep) 2.10
Kommentarer
- Se også: unix.stackexchange.com/questions/17949/…
- Formålet med
-e
er egentlig bare at gøre det entydigt, når en regex starter med en bindestreg. Sågrep ---foo
giverunrecognized option: ---foo
men du kan sigegrep -e ---foo
til at gribe efter det regulære udtryk---foo
.
Svar
-e
er strengt taget flag for at angive det mønster, du vil matche. -E
styrer, om du skal undslippe bestemte specialtegn.
man grep
forklarer -E
det lidt mere:
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
Svar
Også grep -e
giver mulighed for at bruge flere strenge til søgning: "grep -e "abc" -e "def" -e "123"
vil se efter en af de tre af disse strenge: abc
samt def
og 123
.
Dette fungerer meget lig grep "abc\|def\|123"
hvor \|
til or
men c ville være lidt klarere at læse.
Da de vigtigste fakta om grep -E
allerede er forklaret her, vil jeg bare tilføje det, jeg opsummerede om dette emne på et ganske lignende spørgsmål: Regulært udtryk for at finde dobbelttegn i Bash
Svar
se nedenfor
/ udvidet
grep forstår tre forskellige versioner af syntaks for regulært udtryk: “grundlæggende”, “udvidet” og “perl.” I GNU grep er der ingen forskel i tilgængelig funktionalitet mellem basale og udvidede syntakser. I andre implementeringer er grundlæggende regulære udtryk mindre magtfulde. Den følgende beskrivelse gælder for udvidede regulære udtryk; forskelle for grundlæggende regulære udtryk opsummeres bagefter. Perl-regulære udtryk giver yderligere funktionalitet og er dokumenteret i pcresyntax (3) og pcrepattern (3), men er muligvis ikke tilgængelige på alle systemer.
Så , endnu en gang.
I GNU grep er der ingen forskel i tilgængelig funktionalitet mellem basale og udvidede syntakser
Kommentarer
- funktionaliteten er den samme mellem grundlæggende og udvidet, men syntaksen er lidt anderledes. regexp specielle tegn som
(
,)
,|
osv. skal slås backslash til har deres specielle betydning i grundlæggende regexp, men ikke i udvidet (hvor de skal undslippes for at blive behandlet som en streng bogstavelig)
Svar
Bare for at uddybe indstillingen -e
. -e
er ofte valgfri:
grep PATTERN
er identisk med
grep -e PATTERN
medmindre der som angivet i et tidligere svar og på mandsiderne er flere søgemønstre eller for at beskytte et mønster, der begynder med en bindestreg (-).
echo "hello" | grep -o -e 'h|l'
Jeg får ingen output, fordi|
mistede sin specielle betydning, og når jegecho "hello" | grep -o -E 'h|l'
Jeg får den ønskede output.echo "hello" | grep -o -e 'h' -e 'l'
fungerer, hvis du vil kaste-E
i dette tilfælde.grep -e -o 'h|l'
matcher bogstaveligth|l
mensgrep -e -o 'h\|l'
matcherh
ellerl
og med -E det ' er det modsatte