ต่อไปนี้จะพิมพ์การจับคู่บรรทัดTERMINATE
จนถึงจุดสิ้นสุดของไฟล์:
sed -n -e '/TERMINATE/,$p'
อธิบาย: -n
การทำงานเริ่มต้นปิดการใช้งานของsed
การพิมพ์แต่ละบรรทัดหลังจากรันสคริปต์ของมันที่มัน-e
ชี้ให้เห็นสคริปต์ไปsed
, /TERMINATE/,$
เป็นอยู่ (สาย) การเลือกหมายถึงบรรทัดแรกตรงกับช่วงTERMINATE
การแสดงออกปกติ (เช่น grep) ไปยังจุดสิ้นสุดของไฟล์ ( $
) และp
เป็นคำสั่งพิมพ์ที่พิมพ์บรรทัดปัจจุบัน
สิ่งนี้จะพิมพ์จากบรรทัดที่ตามหลังการจับคู่บรรทัดTERMINATE
จนถึงจุดสิ้นสุดของไฟล์:
(จากหลังบรรทัดที่ตรงไปยัง EOF ไม่รวมบรรทัดที่ตรงกัน)
sed -e '1,/TERMINATE/d'
อธิบาย: 1,/TERMINATE/
เป็นการเลือกช่วงที่อยู่ (บรรทัด) หมายถึงบรรทัดแรกสำหรับอินพุตไปยังบรรทัดแรกที่ตรงกับTERMINATE
นิพจน์ทั่วไปและd
เป็นคำสั่งลบที่ลบบรรทัดปัจจุบันและข้ามไปที่บรรทัดถัดไป เนื่องจากsed
พฤติกรรมเริ่มต้นคือการพิมพ์บรรทัดมันจะพิมพ์บรรทัดหลังจากTERMINATE
ถึงจุดสิ้นสุดของอินพุต
แก้ไข:
ถ้าคุณต้องการเส้นก่อนTERMINATE
:
sed -e '/TERMINATE/,$d'
และถ้าคุณต้องการทั้งสองบรรทัดก่อนและหลังTERMINATE
ใน 2 ไฟล์ที่แตกต่างกันในการส่งผ่านครั้งเดียว:
sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file
ไฟล์ก่อนและหลังจะมีบรรทัดที่ถูกยกเลิกดังนั้นในการประมวลผลแต่ละไฟล์ที่คุณต้องใช้:
head -n -1 before
tail -n +2 after
Edit2:
หากคุณไม่ต้องการรหัสฮาร์ดชื่อไฟล์ในสคริปต์ sed คุณสามารถ:
before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file
แต่คุณต้องหลีกเลี่ยง$
ความหมายของบรรทัดสุดท้ายดังนั้นเชลล์จะไม่พยายามขยาย$w
ตัวแปร (โปรดทราบว่าตอนนี้เราใช้เครื่องหมายคำพูดคู่ล้อมรอบสคริปต์แทนที่จะเป็นเครื่องหมายคำพูดเดี่ยว)
ฉันลืมที่จะบอกว่าบรรทัดใหม่มีความสำคัญหลังจากชื่อไฟล์ในสคริปต์เพื่อให้รู้ว่าชื่อไฟล์สิ้นสุด
แก้ไข: 2016-0530
SébastienClémentถามว่า: "คุณจะเปลี่ยนฮาร์ดโค้ดTERMINATE
ด้วยตัวแปรได้อย่างไร"
คุณจะสร้างตัวแปรสำหรับข้อความที่ตรงกันจากนั้นทำเช่นเดียวกับตัวอย่างก่อนหน้า:
matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file
เพื่อใช้ตัวแปรสำหรับข้อความที่ตรงกันกับตัวอย่างก่อนหน้านี้:
## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"
จุดสำคัญเกี่ยวกับการแทนที่ข้อความด้วยตัวแปรในกรณีเหล่านี้คือ:
- ตัวแปร (
$variablename
) อยู่ในsingle quotes
[ '
] จะไม่ "ขยาย" แต่ตัวแปรภายในdouble quotes
[ "
] จะ ดังนั้นคุณต้องเปลี่ยนทั้งหมดsingle quotes
ไปdouble quotes
ถ้าพวกเขามีข้อความที่คุณต้องการแทนที่ด้วยตัวแปร
sed
ช่วงยังมีและมีการปฏิบัติตามทันทีด้วยตัวอักษรเช่น:$
, , พวกเขายังจะมีลักษณะเช่นตัวแปรที่จะขยายตัวดังนั้นคุณจะต้องหลบหนีบรรดาตัวอักษรที่มีเครื่องหมาย [ ] ที่ชอบ: , ,$p
$d
$w
$
\
\$p
\$d
\$w
grep 'TERMINATE' file