Không, sed regexes không có kết hợp không tham lam.
Bạn có thể kết hợp tất cả các văn bản cho đến lần xuất hiện đầu tiên AC
bằng cách sử dụng bất cứ thứ gì không có tên AC
theo sau AC
, cũng giống như của Perl .*?AC
. Vấn đề là, bất cứ thứ gì không chứa, AC
không thể được biểu thị dễ dàng như một biểu thức thông thường: luôn có một biểu thức chính quy nhận ra sự phủ định của biểu thức chính quy, nhưng biểu thức phủ định trở nên phức tạp nhanh chóng. Và trong sed di động, điều này hoàn toàn không thể, bởi vì regex phủ định yêu cầu nhóm một sự thay thế có trong các biểu thức chính quy mở rộng (ví dụ như trong awk) nhưng không phải trong các biểu thức chính quy cơ bản di động. Một số phiên bản của sed, chẳng hạn như GNU sed, có các phần mở rộng cho BRE giúp nó có thể diễn đạt tất cả các biểu thức chính quy có thể.
sed 's/AB\([^A]*\|A[^C]\)*A*AC/XXX/'
Do khó khăn trong việc phủ nhận một biểu thức chính quy, điều này không khái quát tốt. Thay vào đó, những gì bạn có thể làm là thay đổi dòng tạm thời. Trong một số triển khai sed, bạn có thể sử dụng dòng mới làm điểm đánh dấu, vì chúng không thể xuất hiện trong một dòng đầu vào (và nếu bạn cần nhiều điểm đánh dấu, hãy sử dụng dòng mới theo sau là một ký tự khác nhau).
sed -e 's/AC/\
&/g' -e 's/AB[^\
]*\nAC/XXX/' -e 's/\n//g'
Tuy nhiên, hãy cẩn thận với dấu gạch chéo ngược mới không hoạt động trong một bộ ký tự với một số phiên bản sed. Cụ thể, điều này không hoạt động trong GNU sed, đó là triển khai sed trên Linux không nhúng; trong GNU sed bạn có thể sử dụng \n
thay thế:
sed -e 's/AC/\
&/g' -e 's/AB[^\n]*\nAC/XXX/' -e 's/\n//g'
Trong trường hợp cụ thể này, nó đủ để thay thế đầu tiên AC
bằng một dòng mới. Cách tiếp cận tôi trình bày ở trên là tổng quát hơn.
Một cách tiếp cận mạnh mẽ hơn trong sed là lưu dòng vào không gian giữ, loại bỏ tất cả trừ phần thú vị đầu tiên của dòng, trao đổi không gian giữ và không gian mẫu hoặc nối không gian mẫu vào không gian giữ và lặp lại. Tuy nhiên, nếu bạn bắt đầu làm những việc phức tạp như vậy, bạn thực sự nên nghĩ về việc chuyển sang awk. Awk cũng không có kết hợp không tham lam, nhưng bạn có thể tách một chuỗi và lưu các phần thành các biến.