แทนที่ n การเกิดขึ้นของสตริงในแต่ละบรรทัดของไฟล์ข้อความ


15

ฉันมีไฟล์ข้อความขนาดใหญ่ที่มีสตริงคั่นด้วยช่องว่าง (2-5) สตริงสามารถมี "" "หรือ" - " ฉันต้องการแทนที่พูดช่องว่างที่สองด้วยท่อ

วิธีที่ดีที่สุดที่จะไปคืออะไร?

ใช้ sed ฉันคิดเรื่องนี้:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

ความคิดอื่น ๆ / ดีกว่า / เรียบง่ายขึ้น?

คำตอบ:


22

คุณสามารถเพิ่มหมายเลขที่ส่วนท้ายของคำสั่งทดแทน ตัวอย่างเช่นต่อไปนี้จะแทนที่การเกิดขึ้นครั้งที่สองของoldด้วยสตริงnewในแต่ละบรรทัดของfile:

sed 's/old/new/2' file

ดังนั้นแทนที่จะใช้วิธีแก้ปัญหาที่เสนอคุณสามารถใช้:

sed 's/ /|/2'

สำหรับข้อมูลเพิ่มเติมดูเช่นบทช่วยสอนนี้


2
จากsedไฟล์ข้อมูล: "หมายเหตุ: มาตรฐาน POSIX ไม่ได้ระบุสิ่งที่ควรเกิดขึ้นเมื่อคุณผสมการg' and NUMBER modifiers, and currently there is no widely agreed upon meaning across ใช้งานของ sed สำหรับ GNU` sed 'การโต้ตอบถูกกำหนดให้เป็น: ละเว้นการจับคู่ก่อนที่ NUMBER จากนั้นจับคู่และแทนที่ทั้งหมด จับคู่จาก NUMBER ในวันที่ "
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ไฟล์ข้อมูล ... ฉันเกลียดพวกเขา อย่างไรก็ตามฉันได้ลบส่วนที่ไม่ชัดเจน ความคิดเห็นดี +1
mrucci

1
ขอบคุณ mrucci และ Dennis ฉันคิดว่าจะต้องมีสิ่งที่เรียบง่าย
dnkb

sedดูเหมือนว่าปัญหาที่ฉันมีกับการจัดการข้อความทุกฉันจัดการเพื่อแก้ปัญหาด้วย ฉันไม่แน่ใจว่าฉันควรจะขอบคุณคุณสำหรับการทำsedประโยชน์ให้ฉันมากขึ้น แต่ฉันจะทำต่อไป ;)
เจมี่

1

คุณลองรุ่นของคุณหรือไม่ มันใช้งานได้หรือ เพราะฉันคิดว่ามันเป็นความคิดที่ดี ฉันจะทำแตกต่างกันเล็กน้อย แต่:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

วิธีนี้จะยอมรับอักขระใด ๆ ในคำที่ไม่ใช่ช่องว่างและจะยอมรับมากกว่าหนึ่งช่องว่างระหว่างสองคำแรก

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