.ignore
ฉันมีไฟล์ชื่อ projdir
ในความต้องการที่จะเปลี่ยน ตัวอย่างเช่น:
ignore \..*
ignore README
projdir Snake
ฉันต้องการแทนที่ Snake ด้วยเช่น "PacMan" ฉันอ่าน man page แต่ฉันไม่รู้จะทำอย่างไร
.ignore
ฉันมีไฟล์ชื่อ projdir
ในความต้องการที่จะเปลี่ยน ตัวอย่างเช่น:
ignore \..*
ignore README
projdir Snake
ฉันต้องการแทนที่ Snake ด้วยเช่น "PacMan" ฉันอ่าน man page แต่ฉันไม่รู้จะทำอย่างไร
คำตอบ:
ค้นหาบรรทัดที่ขึ้นต้นด้วยprojdir
และแทนที่ทั้งบรรทัดด้วยบรรทัดใหม่:
sed -i 's/^projdir .*$/projdir PacMan/' .ignore
^
และ$
เป็นจุดเริ่มต้น / จุดสิ้นสุดของบรรทัดดังนั้นรูปแบบจะจับคู่กับทั้งบรรทัด .*
ตรงกับสิ่งใด การ-i
บอกsed
ให้เขียนการเปลี่ยนแปลงไปยังโดยตรง.ignore
แทนที่จะส่งออกไป
วิธีหนึ่งคือการเขียนทั้งบรรทัดใหม่โดยใช้การอ้างอิงย้อนหลังสำหรับชิ้นส่วนที่คุณต้องการให้:
sed -e 's/^\( *projdir *\)[^ ]*\(.*\)*$/\1PacMan\2/'
วิธีอื่นคือการเขียนส่วนนั้นของบรรทัดใหม่ แต่เฉพาะบางส่วนที่ตรงกับ:
sed -e '/^ *projdir / s/ [^# ]/ PacMan/'
projdir
ตัวอย่างทั้งสองเขียนคำสองช่องว่างที่คั่นบนเส้นที่คำแรกคือ
แม้ว่านี่จะเป็นบทความเก่าและดูเหมือนว่าจะได้รับการแก้ไขสำหรับคุณโดยคำตอบที่ยอมรับ แต่คำถามจริงยังไม่ได้รับคำตอบ ดังนั้นเพื่อความสมบูรณ์และช่วยเหลือผู้อื่น:
นี่คือคำตอบที่ตรงกับ "Snake" จริง ๆ และไม่ใช่สำหรับบรรทัดที่ขึ้นต้นด้วย "projdir" ...
sed -r 's/(^.*)Snake/\1PacMan' .ignore
สิ่งนี้จะแทนที่ทุกอย่างตั้งแต่เริ่มต้นของบรรทัดรวมถึง "งู" กับทุกสิ่งก่อน "งู" + "PacMan" \ 1 หมายถึงสิ่งที่จับคู่ไว้ข้างใน () ทุกอย่างหลังจาก "งู" ยังคงไม่มีใครแตะต้อง
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore
^ projdir คือการหาบรรทัดที่ขึ้นต้นด้วย string projdir . * $ มีหมายถึงสตริงหลังจาก projdir ในบรรทัดบรรทัดเดียวกัน สตริง projdir PacMan คือสตริงที่เรากำลังแทนที่ g สำหรับโลก - เพื่อแทนที่บรรทัดดังกล่าวทั้งหมดที่เริ่มต้นด้วย projdir .ignore เป็นชื่อของไฟล์
-i
ซึ่งเป็น--in-place
ตัวอย่างจะมีการจัดทำเอกสารด้วยตนเองมากกว่า