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

  • Se også: unix.stackexchange.com/questions/17949/…
  • Formålet med -e er egentlig bare å gjøre det entydig når en regex starter med en bindestrek. Så grep ---foo gir unrecognized option: ---foo men du kan si grep -e ---foo for å grep for det regulære uttrykket ---foo.

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ør echo "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 med h|l mens grep -e -o 'h\|l' samsvarer med h eller l 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 (-).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *