ในกลุ่มเราสามารถใช้\zs
อะตอมเพื่อพูดว่า "เริ่มการแข่งขันได้ที่นี่จริงๆ":
:%s/funnyword\zs.*$/otherword/
มีเทียบเท่าสำหรับ sed หรือแม้แต่ perl?
ในกลุ่มเราสามารถใช้\zs
อะตอมเพื่อพูดว่า "เริ่มการแข่งขันได้ที่นี่จริงๆ":
:%s/funnyword\zs.*$/otherword/
มีเทียบเท่าสำหรับ sed หรือแม้แต่ perl?
คำตอบ:
ใน 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 หรือแนวทางอื่น ๆ