การแทนที่สตริงตามหมายเลขบรรทัด


50

ฉันมีสถานการณ์ที่ฉันต้องการแทนที่สตริงเฉพาะในไฟล์จำนวนมาก

แทนที่สตริงAAAด้วยสตริงBBBอื่นแต่มีจำนวนมากของสตริงที่เริ่มต้นด้วย AAA หรือสิ้นสุดใน AAA และฉันต้องการที่จะแทนที่เพียงหนึ่งในบรรทัดที่ 34 และให้คนอื่น ๆ เหมือนเดิม

เป็นไปได้หรือไม่ที่จะระบุด้วยหมายเลขบรรทัดบนไฟล์ทั้งหมดสตริงนี้ตรงกับบรรทัดที่ 34

คำตอบ:


82

คุณสามารถระบุหมายเลขบรรทัดใน sed หรือ NR (จำนวนบันทึก) ใน awk

awk 'NR==34 { sub("AAA", "BBB") }'

หรือใช้ FNR (บันทึกหมายเลขไฟล์) หากคุณต้องการระบุมากกว่าหนึ่งไฟล์ในบรรทัดคำสั่ง

awk 'FNR==34 { sub("AAA", "BBB") }'

หรือ

sed '34s/AAA/BBB/'

ทำแทนในสถานที่ด้วย sed

sed -i '34s/AAA/BBB/' file_name

-3

สมมติว่าคุณต้องการแทนที่บรรทัดที่สามใน file_record:

sed -i "s/`head -3 file_record | tail -1 `/replaced/" file_record


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