Yritän ymmärtää eroa grep -e
ja grep -E
. Nyt osoitteesta grep manpage
sain:
-E, –extended-regexp
Tulkitse PATTERN laajennettuna säännöllisenä lausekkeena (katso alla).
-e PATTERN, –regexp = PATTERN
Käytä mallina PATTERN; hyödyllinen suojaamaan kuvioita, jotka alkavat –
Yllä oleva selitys ei ole minulle järkevää.
Voiko joku siis selittää sen minä käytän examples
mitä eroa on näiden kahden välillä ja milloin mitä vaihtoehtoa käytetään.
PS: Versio: grep (GNU grep) 2.10
Kommentit
vastaus
-e
on ehdottomasti lippu, joka osoittaa mallin, jota haluat sovittaa. -E
hallitsee, tarvitseeko tiettyjä erikoismerkkejä välttää.
man grep
selittää -E
vähän enemmän:
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.
Kommentit
- joten tämä on syy En
echo "hello" | grep -o -e 'h|l'
En saa tulosteita, koska|
menetti erityis merkityksensä ja kun teenecho "hello" | grep -o -E 'h|l'
Saan halutun tuloksen. - Kyllä.
echo "hello" | grep -o -e 'h' -e 'l'
toimii, jos haluat heittää-E
tässä tapauksessa. -
grep -e -o 'h|l'
vastaa kirjaimellisestih|l
, kun taasgrep -e -o 'h\|l'
vastaah
tail
ja -E: n kanssa se ' s päinvastoin - @ronnie it ' s valitettavasti tarvitset yli 200 mainetta, jotta " -ominaisuus " seuraa sinua SE-sivustojen välillä …
Vastaus
Myös grep -e
sallii useiden merkkijonojen käyttämisen hakuun: "grep -e "abc" -e "def" -e "123"
etsii mitä tahansa näistä kolmesta merkkijonosta: abc
sekä def
ja 123
.
Tämä toimii melko samankaltaisesti kuin grep "abc\|def\|123"
missä \|
on or
, mutta c pitäisi olla hieman selkeämpi lukea.
Koska tärkeimmät tosiasiat aiheesta grep -E
on jo selitetty, haluan vain lisätä, mitä olen tiivistänyt tästä aiheesta melko samankaltaiseen kysymykseen: Säännöllinen lauseke kaksoismerkkien löytämiseksi Bashista
Vastaa
katso alla
/ laajennettu
grep ymmärtää säännöllisen lausekkeen syntaksin kolme eri versiota: ”basic”, ”Extended” ja ”perl”. GNU grep -sovelluksessa käytettävissä olevien toimintojen välillä ei ole eroa perus- ja laajennettujen syntaksien välillä. Muissa toteutuksissa säännölliset peruslausekkeet ovat vähemmän tehokkaita. Seuraava kuvaus koskee laajennettuja säännöllisiä lausekkeita; Säännöllisten peruslausekkeiden erot on tiivistetty jälkeenpäin. Perlin säännölliset lausekkeet tarjoavat lisätoimintoja, ja ne dokumentoidaan PCresyntaxissa (3) ja pcrepatternissa (3), mutta ne eivät välttämättä ole käytettävissä kaikissa järjestelmissä.
Joten , vielä kerran.
GNU grepissä käytettävissä olevien toimintojen välillä ei ole eroa perus- ja laajennettujen syntaksien välillä.
Kommentit
- toiminnallisuus on sama perus- ja laajennetun välillä, mutta syntaksissa on hieman eroja. regexp-erikoismerkit, kuten
(
,)
,|
jne., täytyy välttää taaksepäin. niillä on erityinen merkitys peruskirjassa, mutta ei laajennettuna (missä ne on vältettävä, jotta niitä voidaan käsitellä merkkijonon kirjaimina)
Vastaa
Vain -e
-vaihtoehdon tarkentamiseksi. -e
on usein valinnainen:
grep PATTERN
on identtinen
grep -e PATTERN
ellei, kuten aikaisemmassa vastauksessa ja man-sivuilla todetaan, on useita hakumalleja, tai jos haluat suojata yhdysmerkillä (-) alkavan kuvion.
-e
-kohdan tarkoitus on oikeastaan vain erottaa, kun regex alkaa viivalla. Jotengrep ---foo
antaaunrecognized option: ---foo
, mutta voit sanoa, ettägrep -e ---foo
tarttuu säännöllisen lausekkeen---foo
.