Có tương đương với \ zs của vim trong sed hoặc perl không?


11

Trong vim chúng ta có thể sử dụng \zsnguyên tử để nói "thực sự bắt đầu trận đấu ngay tại đây":

:%s/funnyword\zs.*$/otherword/

Có một tương đương cho sed hoặc thậm chí perl?

Câu trả lời:


15

Trong Perl (và PCRE), điều này có thể đạt được với giao diện có độ rộng bằng không :

(?<=funnyword).*$

phù hợp với "từ hài hước", nhưng không tiêu thụ nó như một phần của trận đấu. Chúng chỉ hoạt động với văn bản có độ dài cố định trong giao diện. Bạn cũng có thể sử dụng lookbehinds ( (?<!...)) để xác định rằng một số văn bản không có ở đó.

Trong bất kỳ phiên bản hợp lý nào gần đây của Perl, \Kgần như là một sự thay thế chính xác cho việc\zs bạn đang sử dụng nó:

funnyword\K.*$

\Kloại bỏ mọi thứ khớp cho đến nay nhưng vẫn tiếp tục khớp từ thời điểm đó trở đi. Phần trước \Kkhông phải là chiều dài cố định. Điều này cũng có trong PCRE bây giờ , nhưng tôi không chắc nó đã ra phiên bản nào.

\zethay vào đó, có thể đạt được với một cái nhìn không có chiều rộng bằng cách sử dụng (?=...). Mô hình đó không cần phải có chiều dài cố định.


Bởi vì sed sử dụng POSIX BREs , không có cái nhìn nào . Tuy nhiên, trong trường hợp này, bạn có thể dễ dàng mô phỏng nó bằng cách sử dụng một nhóm chụp thông thường:

sed -e 's/\(funnyword\).*$/\1otherword/'

Bạn có thể làm tương tự cho cái nhìn tích cực. Nếu bạn thực sự có một yêu cầu phức tạp hơn, bạn có thể phải tìm đến Perl hoặc một số phương pháp khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.