Sto cercando di capire la differenza tra grep -e e grep -E. Ora da grep manpage ho:

-E, –extended-regexp

Interpreta PATTERN come unespressione regolare estesa (vedi sotto).

-e PATTERN, –regexp = PATTERN

Usa PATTERN come modello; utile per proteggere i modelli che iniziano con –

La spiegazione sopra non ha senso per me.

Quindi, qualcuno può spiegarla a io usando examples qual è la differenza tra i due e quando utilizzare quale opzione.

PS: Versione: grep (GNU grep) 2.10

Commenti

  • Vedi anche: unix.stackexchange.com/questions/17949/…
  • Lo scopo di -e è in realtà solo quello di chiarire le ambiguità quando una regex inizia con un trattino. Quindi grep ---foo restituisce unrecognized option: ---foo ma puoi dire grep -e ---foo a grep per lespressione regolare ---foo.

Risposta

-e è strettamente la bandiera per indicare il modello con cui vuoi confrontare. -E controlla se è necessario eseguire lescape di determinati caratteri speciali.

man grep spiega -E un po di più:

 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. 

Commenti

  • quindi questo è il motivo per cui echo "hello" | grep -o -e 'h|l' non ottengo alcun output perché | ha perso il suo significato speciale e quando lo faccio echo "hello" | grep -o -E 'h|l' Ottengo loutput desiderato.
  • Sì. echo "hello" | grep -o -e 'h' -e 'l' funzionerà se desideri eliminare -E in questo caso.
  • grep -e -o 'h|l' corrisponderà letteralmente a h|l mentre grep -e -o 'h\|l' corrisponderà a h o l e con -E ' è il contrario
  • @ronnie it ' è un peccato che tu abbia bisogno di oltre 200 reputazione per avere quella " funzione " seguirti tra i siti SE …

Risposta

Inoltre grep -e consente di utilizzare diverse stringhe per la ricerca: "grep -e "abc" -e "def" -e "123" cercherà una qualsiasi di queste tre stringhe: abc così come def e 123.

Funziona in modo abbastanza simile a grep "abc\|def\|123" dove sta \| per or ma c Potrebbe essere un po più chiaro da leggere.

Poiché i fatti più importanti su grep -E sono già spiegati qui, voglio solo aggiungere ciò che ho riassunto su questo argomento su una domanda abbastanza simile: Espressione regolare per trovare caratteri doppi in Bash

Risposta

vedi sotto

/ extended

grep comprende tre diverse versioni della sintassi delle espressioni regolari: “basic”, “extended” e “perl”. In GNU grep, non cè differenza nelle funzionalità disponibili tra sintassi di base ed estesa. In altre implementazioni, le espressioni regolari di base sono meno potenti. La seguente descrizione si applica alle espressioni regolari estese; le differenze per le espressioni regolari di base sono riassunte in seguito. Le espressioni regolari Perl forniscono funzionalità aggiuntive e sono documentate in pcresyntax (3) e pcrepattern (3), ma potrebbero non essere disponibili su tutti i sistemi.

Quindi , ancora una volta.

In GNU grep, non cè differenza nelle funzionalità disponibili tra sintassi di base ed estesa

Commenti

  • la funzionalità è la stessa tra base ed estesa ma la sintassi è leggermente diversa. caratteri speciali regexp come (, ), | ecc. devono essere sottoposti a escape backslash a hanno il loro significato speciale nella regexp di base, ma non in quella estesa (dove è necessario eseguire lescape per essere trattata come una stringa letterale)

Risposta

Solo per approfondire lopzione -e. -e è spesso facoltativo:

grep PATTERN 

è identico a

grep -e PATTERN 

a meno che, come affermato in una risposta precedente e nelle pagine man, ci siano più schemi di ricerca, o per proteggere uno schema che inizia con un trattino (-).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *