Risposte:
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 sed
varianti, ad esempio quella utilizzata nei BSD, che si comportano diversamente.
sed
supporta 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'
Poiché ci sono diversi commenti riguardanti sed
implementazioni non Gnu : almeno su OS X, puoi usare l' -E
argomento 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
GNU sed supporta anche l' -r
opzione (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
-r
opzione è davvero utile per la leggibilità delle espressioni. Questa dovrebbe essere la risposta accettata.
Non \|
funziona neanche con sed su Solaris 10. Quello che ho fatto è stato usare
perl -p -e 's/bl(ia|f)//g'
Followup: sed -E lo consente su MacOS. Nessuna barra rovesciata per |.
sed -E 's/this|orthat/oooo/g' infile