ฉันจะแทนที่ข้อความหลังจากคำใดคำหนึ่งโดยใช้ sed ได้อย่างไร


12

.ignoreฉันมีไฟล์ชื่อ projdirในความต้องการที่จะเปลี่ยน ตัวอย่างเช่น:

ignore \..*
ignore README
projdir Snake

ฉันต้องการแทนที่ Snake ด้วยเช่น "PacMan" ฉันอ่าน man page แต่ฉันไม่รู้จะทำอย่างไร

คำตอบ:


18

ค้นหาบรรทัดที่ขึ้นต้นด้วยprojdirและแทนที่ทั้งบรรทัดด้วยบรรทัดใหม่:

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^และ$เป็นจุดเริ่มต้น / จุดสิ้นสุดของบรรทัดดังนั้นรูปแบบจะจับคู่กับทั้งบรรทัด .*ตรงกับสิ่งใด การ-iบอกsedให้เขียนการเปลี่ยนแปลงไปยังโดยตรง.ignoreแทนที่จะส่งออกไป


หากคุณใช้ตัวเลือกแบบยาว-iซึ่งเป็น--in-placeตัวอย่างจะมีการจัดทำเอกสารด้วยตนเองมากกว่า
Elijah Lynn

5

วิธีหนึ่งคือการเขียนทั้งบรรทัดใหม่โดยใช้การอ้างอิงย้อนหลังสำหรับชิ้นส่วนที่คุณต้องการให้:

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

วิธีอื่นคือการเขียนส่วนนั้นของบรรทัดใหม่ แต่เฉพาะบางส่วนที่ตรงกับ:

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

projdirตัวอย่างทั้งสองเขียนคำสองช่องว่างที่คั่นบนเส้นที่คำแรกคือ


3

แม้ว่านี่จะเป็นบทความเก่าและดูเหมือนว่าจะได้รับการแก้ไขสำหรับคุณโดยคำตอบที่ยอมรับ แต่คำถามจริงยังไม่ได้รับคำตอบ ดังนั้นเพื่อความสมบูรณ์และช่วยเหลือผู้อื่น:

นี่คือคำตอบที่ตรงกับ "Snake" จริง ๆ และไม่ใช่สำหรับบรรทัดที่ขึ้นต้นด้วย "projdir" ...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

สิ่งนี้จะแทนที่ทุกอย่างตั้งแต่เริ่มต้นของบรรทัดรวมถึง "งู" กับทุกสิ่งก่อน "งู" + "PacMan" \ 1 หมายถึงสิ่งที่จับคู่ไว้ข้างใน () ทุกอย่างหลังจาก "งู" ยังคงไม่มีใครแตะต้อง


1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir คือการหาบรรทัดที่ขึ้นต้นด้วย string projdir . * $ มีหมายถึงสตริงหลังจาก projdir ในบรรทัดบรรทัดเดียวกัน สตริง projdir PacMan คือสตริงที่เรากำลังแทนที่ g สำหรับโลก - เพื่อแทนที่บรรทัดดังกล่าวทั้งหมดที่เริ่มต้นด้วย projdir .ignore เป็นชื่อของไฟล์


1
คุณช่วยขยายคำตอบของคุณและอธิบายสิ่งที่เกิดขึ้นได้ไหม?
Romeo Ninov

รู้รอบมีประโยชน์มากขึ้นถ้าพวกเขามีคำอธิบายเกี่ยวกับวิธีการและเหตุผลที่คำสั่งหรือชิ้นส่วนของรหัสทำงาน
Anthony Geoghegan

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