ในกลุ่มเราสามารถใช้\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 หรือแนวทางอื่น ๆ