uso dell'alternanza “|” nel regex di sed


79

Sto usando sed, GNU sed versione 4.2.1. Voglio usare l'alternanza "|" simbolo in una sottoespressione. Per esempio :

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

dovrebbe tornare

" blib bou "

ma ritorna

"blia blib bou blf".

Come posso avere il risultato atteso?

Risposte:


110

Il "|" ha anche bisogno di una barra rovesciata per ottenere il suo significato speciale.

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

farà quello che vuoi.

Come sai, se tutto il resto fallisce, leggi il manuale :-).

Manuale utente di GNU sed , sezione 3.3 Panoramica della sintassi delle espressioni regolari :

`RegExp1 \ | REGEXP2'

Corrisponde a REGEXP1 o REGEXP2.

Nota la barra rovesciata ...

Sfortunatamente, la sintassi regex non è davvero standardizzata ... ci sono molte varianti, che differiscono tra le altre cose in cui "caratteri speciali" necessitano \ e quali no. In alcuni è persino configurabile o dipende dagli switch (come in GNU grep, che è possibile alternare tra tre diversi dialetti regex).

Questa risposta in particolare è per GNU sed . Esistono altre sedvarianti, ad esempio quella utilizzata nei BSD, che si comportano diversamente.


35
Per chiunque altro confuso da questa risposta \ | funziona solo in gnu sed (gsed su os x) e non in vanilla sed (sed su os x).
Andrew Hancox,

@AndrewHancox Grazie mille! Stavo per strapparmi tutti i capelli dalla testa (e finora sto andando abbastanza bene rispetto al mio manager sul fronte dei capelli) - So di conoscere abbastanza RegEx da provare | e \ | ma non ho mai pensato al fatto che OSX potrebbe effettivamente utilizzare una versione non gnu.
phatskat,

8
La versione standard di BSD / OS X sedsupporta l'alternanza, ma solo con la sintassi regex "estesa" ( -E) - il che significa che non ci sono barre rovesciate sui tubi o sulle parentesi:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Mark Reed

2
Ho modificato la mia risposta per notare che è solo per GNU sed.
sleske,

23

Poiché ci sono diversi commenti riguardanti sedimplementazioni non Gnu : almeno su OS X, puoi usare l' -Eargomento per  sed:

Interpreta le espressioni regolari come espressioni regolari (moderne) estese anziché come espressioni regolari di base (BRE). La pagina man re_format (7) descrive completamente entrambi i formati.

Quindi puoi utilizzare i metacaratteri delle espressioni regolari senza sfuggirli. Esempio:

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou 

12

GNU sed supporta anche l' -ropzione (espressioni regolari estese). Questo significa che non devi fuggire dai metacaratteri:

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

Produzione:

hi hi

Sì, l' -ropzione è davvero utile per la leggibilità delle espressioni. Questa dovrebbe essere la risposta accettata.
рüффп,

9

Non \|funziona neanche con sed su Solaris 10. Quello che ho fatto è stato usare

perl -p -e 's/bl(ia|f)//g'

2
+1 per la portabilità poiché, se un sistema ha perl, utilizzerà sempre questa sintassi, a differenza di sed.
evilsoup,

4

Followup: sed -E lo consente su MacOS. Nessuna barra rovesciata per |.

 sed -E 's/this|orthat/oooo/g' infile

1

In GnuWin32 su Windows sed la sintassi è sed "s/thing1\|thing2/ /g" source > destination.

Le virgolette devono essere di tipo ": questo è "Obbligatorio" per il comando da analizzare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.