„|” 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, abysed
:Następnie możesz używać metaznaków wyrażeń regularnych bez ich ucieczki. Przykład:
źródło
GNU sed obsługuje również tę
-r
opcję (rozszerzone wyrażenia regularne). Oznacza to, że nie musisz uciekać przed metaznakami:Wynik:
źródło
-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źródło
Kontynuacja: sed -E zezwala na to w systemie MacOS. Nie ma potrzeby stosowania odwrotnego ukośnika.
źródło
W GnuWin32 na Windows sed składnia jest następująca
sed "s/thing1\|thing2/ /g" source > destination
.Cytaty muszą być typu
"
- jest to „Wymagane”, aby polecenie zostało przeanalizowane.źródło