Câu trả lời:
"|" cũng cần một dấu gạch chéo ngược để có được ý nghĩa đặc biệt của nó.
echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
sẽ làm những gì bạn muốn.
Như bạn biết, nếu vẫn thất bại, hãy đọc hướng dẫn :-).
Hướng dẫn sử dụng GNU sed , phần 3.3 Tổng quan về Cú pháp biểu thức chính quy :
`REGEXP1 \ | REGEXP2 '
Phù hợp với REGEXP1 hoặc REGEXP2.
Lưu ý dấu gạch chéo ngược ...
Thật không may, cú pháp regex không thực sự được chuẩn hóa ... có nhiều biến thể, khác nhau giữa những thứ khác trong đó "ký tự đặc biệt" cần \ và không có. Trong một số, nó thậm chí có thể định cấu hình hoặc phụ thuộc vào các công tắc (như trong GNU grep
, mà bạn có thể chuyển đổi giữa ba phương ngữ regex khác nhau).
Câu trả lời này đặc biệt dành cho GNU sed . Có các sed
biến thể khác, ví dụ như biến thể được sử dụng trong BSD, hoạt động khác nhau.
sed
không hỗ trợ xen kẽ, nhưng chỉ với cú pháp regex "mở rộng" ( -E
) - có nghĩa là không có dấu gạch chéo ngược trên đường ống hoặc dấu ngoặc đơn:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Vì có một số nhận xét liên quan đến việc sed
triển khai không phải Gnu : Ít nhất là trên OS X, bạn có thể sử dụng -E
đối số để sed
:
Giải thích các biểu thức chính quy như các biểu thức chính quy mở rộng (hiện đại) thay vì các biểu thức chính quy cơ bản (BRE's). Trang hướng dẫn re_format (7) mô tả đầy đủ cả hai định dạng.
Sau đó, bạn có thể sử dụng siêu ký tự biểu thức chính quy mà không thoát khỏi chúng. Thí dụ:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
GNU sed cũng hỗ trợ -r
tùy chọn (biểu thức chính quy mở rộng). Điều này có nghĩa là bạn không phải thoát khỏi các ký tự đại diện:
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
Đầu ra:
hi hi
-r
tùy chọn thực sự hữu ích cho khả năng đọc của các biểu thức. Đó nên là câu trả lời được chấp nhận.
Nó \|
cũng không hoạt động với sed trên Solaris 10. Những gì tôi đã làm là sử dụng
perl -p -e 's/bl(ia|f)//g'
Theo dõi: sed -E cho phép nó trên MacOS. Không cần dấu gạch chéo ngược cho |.
sed -E 's/this|orthat/oooo/g' infile