Sumary
ไวยากรณ์ GNU:
sed '/claudio/{s//claudia/;:p;n;bp}' file
หรือแม้กระทั่ง (เพื่อใช้เพียงครั้งเดียวคำที่จะถูกแทนที่:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
หรือในไวยากรณ์ POSIX:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
ทำงานบน sed ใด ๆ ประมวลผลเพียงหลายบรรทัดเท่าที่จำเป็นเพื่อค้นหาบรรทัดแรกclaudio
ทำงานแม้ว่าclaudio
จะอยู่ในบรรทัดแรกและสั้นลงเนื่องจากใช้เพียงหนึ่งสตริง regex
รายละเอียด
หากต้องการเปลี่ยนเพียงหนึ่งบรรทัดคุณต้องเลือกเพียงหนึ่งบรรทัด
ใช้ a 1,/claudio/
(จากคำถามของคุณ) เลือก:
- จากบรรทัดแรก (โดยไม่มีเงื่อนไข)
- ไปต่อไป
claudio
บรรทัดที่มีสตริง
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
ในการเลือกบรรทัดใด ๆที่มีclaudio
ให้ใช้:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
และหากต้องการเลือกเฉพาะไฟล์แรก claudio
ให้ใช้:
sed -n '/claudio/{p;q}' file
claudio 1
จากนั้นคุณสามารถทำการทดแทนบนบรรทัดนั้นเท่านั้น:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
ซึ่งจะเปลี่ยนเฉพาะการเกิดขึ้นครั้งแรกของการจับคู่ regex บนบรรทัดแม้ว่าจะมีมากกว่าหนึ่งรายการในบรรทัดแรกที่ตรงกับ regex
แน่นอน/claudio/
regex สามารถทำให้ง่ายขึ้นไปที่:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
และจากนั้นสิ่งเดียวที่ขาดหายไปคือการพิมพ์บรรทัดอื่นทั้งหมดที่ไม่ได้แก้ไข:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
: (0,/REGEXP/
: หมายเลขบรรทัด 0 สามารถใช้ในการระบุที่อยู่เช่น0,/REGEXP/
นั้นsed
จะพยายามจับคู่ REGEXP ในบรรทัดแรกเช่นกัน0,/REGEXP/
คือ คล้ายกับ1,/REGEXP/
ยกเว้นว่าถ้า ADDR2 ตรงกับบรรทัดแรกของอินพุต 0 / REGEXP / แบบฟอร์มจะพิจารณาให้จบช่วงในขณะที่ 1 / REGEXP / รูปแบบจะตรงกับจุดเริ่มต้นของช่วงและทำให้ช่วงขยาย มากถึงการเกิดขึ้นครั้งที่สองของนิพจน์ทั่วไป)