มีอะไรเทียบเท่า vim's \ zs ในแบบ sed หรือ perl หรือไม่?


11

ในกลุ่มเราสามารถใช้\zsอะตอมเพื่อพูดว่า "เริ่มการแข่งขันได้ที่นี่จริงๆ":

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

มีเทียบเท่าสำหรับ sed หรือแม้แต่ perl?

คำตอบ:


15

ใน Perl (และ PCRE) สามารถทำได้ด้วยlookbehind ความกว้างเป็นศูนย์ :

(?<=funnyword).*$

ซึ่งตรงกับ "funnyword" แต่ไม่ได้ใช้เป็นส่วนหนึ่งของการแข่งขัน สิ่งเหล่านี้ใช้ได้กับข้อความที่มีความยาวคงที่ใน lookbehind เท่านั้น นอกจากนี้คุณยังสามารถใช้ lookbehinds เชิงลบ ( (?<!...)) เพื่อระบุว่าข้อความบางส่วนไม่มีอยู่

ใน Perl รุ่นล่าสุดที่สมเหตุสมผลใด ๆ\Kเกือบจะเป็นสิ่งทดแทนที่แน่นอนสำหรับ\zsที่คุณใช้:

funnyword\K.*$

\Kทิ้งทุกอย่างที่ตรงกันไป แต่ยังคงจับคู่จากจุดนั้นเป็นต้นไป ส่วนก่อน\Kไม่จำเป็นต้องมีความยาวคงที่ นี่ยังอยู่ใน PCREด้วย แต่ฉันไม่แน่ใจว่าจะมีเวอร์ชันใดเข้ามาบ้าง

\zeสามารถทำได้ด้วย lookahead (?=...)ศูนย์ความกว้างแทนการใช้ รูปแบบนั้นไม่จำเป็นต้องมีความยาวคงที่


เพราะการใช้ sed POSIX Bres , ไม่มี LookAround ในกรณีนี้คุณสามารถจำลองมันได้ง่าย ๆ ด้วยกลุ่มจับภาพธรรมดา:

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

คุณสามารถทำเช่นเดียวกันสำหรับ lookahead บวก หากคุณมีความต้องการที่ซับซ้อนมากขึ้นคุณอาจต้องดู Perl หรือแนวทางอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.