Odpowiedzi:
„|” potrzebuje także odwrotnego ukośnika, aby uzyskać jego specjalne znaczenie.
echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
zrobi co chcesz.
Jak wiesz, jeśli wszystko inne zawiedzie, przeczytaj instrukcję :-).
Podręcznik użytkownika GNU sed , sekcja 3.3 Przegląd składni wyrażeń regularnych :
`REGEXP1 \ | REGEXP2 '
Odpowiada REGEXP1 lub REGEXP2.
Zwróć uwagę na odwrotny ukośnik ...
Niestety składnia wyrażeń regularnych nie jest tak naprawdę ustandaryzowana ... istnieje wiele wariantów, które różnią się między innymi tym, w których „znakach specjalnych” potrzeba \ a które nie. W niektórych jest nawet konfigurowalny lub zależy od przełączników (jak w GNU grep
, które można przełączać między trzema różnymi dialektami wyrażeń regularnych).
Ta odpowiedź dotyczy w szczególności GNU sed . Istnieją inne sed
warianty, na przykład ten stosowany w BSD, które zachowują się inaczej.
sed
obsługuje naprzemiennie, ale tylko z „rozszerzoną” składnią wyrażenia regularnego ( -E
) - co oznacza, że nie ma ukośników odwrotnych ani w potokach, ani w nawiasach:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Ponieważ istnieje kilka komentarzy dotyczących sed
implementacji innych niż Gnu : Przynajmniej w OS X, możesz użyć -E
argumentu, aby sed
:
Interpretuj wyrażenia regularne jako rozszerzone (nowoczesne) wyrażenia regularne zamiast podstawowych wyrażeń regularnych (BRE). Strona podręcznika re_format (7) w pełni opisuje oba formaty.
Następnie możesz używać metaznaków wyrażeń regularnych bez ich ucieczki. Przykład:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
GNU sed obsługuje również tę -r
opcję (rozszerzone wyrażenia regularne). Oznacza to, że nie musisz uciekać przed metaznakami:
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
Wynik:
hi hi
-r
opcja jest naprawdę bardzo pomocna dla czytelności wyrażeń. To powinna być zaakceptowana odpowiedź.
To \|
również nie działa z sed na Solarisie 10. Zrobiłem to
perl -p -e 's/bl(ia|f)//g'
Kontynuacja: sed -E zezwala na to w systemie MacOS. Nie ma potrzeby stosowania odwrotnego ukośnika.
sed -E 's/this|orthat/oooo/g' infile