ไม่ต้องลบรูปแบบเริ่มต้นทั้งหมดที่ตรงกันจากบรรทัด


11

ฉันมีบรรทัดต่อไปนี้:

abababtestab

ฉันพยายามหาsedนิพจน์เพื่อลบการเกิดขึ้นทั้งหมดabจากจุดเริ่มต้นของบรรทัดดังนั้นบรรทัดที่แปลงควรเป็น:

testab

ฉันรู้สึกเช่นนี้ควรจะง่าย sedแต่ผมไม่ทราบอะไรเกี่ยวกับ

สิ่งที่ฉันมีอยู่คือ:

sed 's/^ab//'

แต่สิ่งนี้จะลบเฉพาะการเกิดขึ้นครั้งแรกของ ab

คำตอบ:


16
sed 's/^\(ab\)*//' <in >out

คุณควรจัดกลุ่มมัน

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

บางเก่าsedsอาจจะไม่จัดการที่ดีมากแม้ว่า แม้ว่าการทำซ้ำ sub-expression เป็นคุณสมบัติที่ระบุ POSIXของ BRE บางseds ไม่สนับสนุนอย่างถูกต้อง ในบางส่วนของ ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... อาจทำงานแทน


ว่าสิ่งที่ฉันกำลังมองหาขอบคุณ! (ฉันจะทำเครื่องหมายเป็นคำตอบเมื่อมันช่วยให้ฉัน)
Dan

แม้แต่รุ่นที่ 7 sedจากปี 1979 ก็ยังรองรับ มันจะต้องเป็นการเลียนแบบที่ด้อยกว่าไม่ให้จัดการกับการจัดกลุ่ม
Jonathan Leffler

@JonathanLeffler - ดูเหตุผลของการแสดงออกปกติ POSIX ซึ่งเป็นส่วนหนึ่งสิ่งที่ฉันใช้คำสั่ง บางทีมันอาจจะเป็นสมมติฐาน แต่มีวรรคมี ... นักพัฒนามาตรฐานการยกย่องพฤติกรรมทางประวัติศาสตร์ร่วมกันซึ่งได้รับการสนับสนุนแต่ไม่\n* หรือเป็นผลลัพธ์ที่ไม่ได้ตั้งใจของการใช้งานที่เฉพาะเจาะจงและพวกเขาสนับสนุนทั้งการทำซ้ำและการแสดงออกช่วงเวลาดังต่อไปนี้ subexpressions และการอ้างอิงกลับ \n\{min,max\}\(...\)*\(...\)\{min,max\}
mikeserv

@JonathanLeffler: มันไม่ได้ทำงานกับรุ่น sed จากเครื่องมือมรดกตกทอด
cuonglm

@cuonglm - The \(ab\)\1*รุ่นงาน w / มรดกสืบทอดเริ่มต้นsedและ\(ab\)*ผลงานรุ่น w / SuSv4 sedมรดกตกทอด อย่างน้อยมันก็ทำเพื่องานสร้างของฉัน เป็นที่ยอมรับฉันสร้างมรดกตกทอดของฉันตั้งอยู่กับ musl lib C และดังนั้นฉันจึงจินตนาการได้ว่ามันอาจทำให้พฤติกรรมแตกต่างออกไป แต่โดยปกติเมื่อคุณสมบัติที่ระบุทำงานในเครื่องมือ Heirloom SuSv4 แต่ไม่ได้อยู่ในเครื่องมือเริ่มต้นมันเป็นเพราะ dev ทำให้มันเป็นเช่นนั้น
mikeserv

6

อีกsed:

sed -e ':1' -e 's/^ab//;t1'

ด้วยการป้อนข้อมูลแต่ละบรรทัดเราตั้งค่าป้ายกำกับ:1จากนั้นทำsubtion abเมื่อเริ่มต้นบรรทัด ถ้าsubstitution สำเร็จแล้วให้tแยก command command to label 1และทำซ้ำงานจนกว่าจะไม่มีabรูปแบบปรากฏขึ้นที่จุดเริ่มต้นของบรรทัดเราทำเสร็จแล้ว


ความคิดของฉันอย่างแน่นอน อย่างเคร่งครัดคุณไม่จำเป็นต้องทดสอบ: s/^ab//; t1เพียงพอแล้ว
เกล็นแจ็

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