ฉันต้องการลบหมายเลขบรรทัดอย่างน้อยหนึ่งหมายเลขออกจากไฟล์ ฉันจะทำสิ่งนี้โดยใช้ sed ได้อย่างไร
ฉันต้องการลบหมายเลขบรรทัดอย่างน้อยหนึ่งหมายเลขออกจากไฟล์ ฉันจะทำสิ่งนี้โดยใช้ sed ได้อย่างไร
คำตอบ:
หากคุณต้องการลบบรรทัดที่ 5 ถึง 10 และ 12:
sed -e '5,10d;12d' file
นี่จะพิมพ์ผลลัพธ์ไปที่หน้าจอ หากคุณต้องการบันทึกผลลัพธ์ไปยังไฟล์เดียวกัน:
sed -i.bak -e '5,10d;12d' file
จะเป็นการสำรองไฟล์สูงสุดfile.bak
และลบบรรทัดที่กำหนด
หมายเหตุ: หมายเลขบรรทัดเริ่มต้นที่ 1 บรรทัดแรกของไฟล์คือ 1 ไม่ใช่ 0
sed -e '5,$d' file
sed -e '5d' file
@KanagaveluSugumar ไวยากรณ์คือ<address><command>
; โดยที่<address>
สามารถเป็นได้ทั้งบรรทัดเดียว5
หรือช่วงของบรรทัดที่ชอบ5,10
และคำสั่งd
จะลบบรรทัดหรือบรรทัดที่กำหนด ที่อยู่อาจเป็นนิพจน์ทั่วไปหรือเครื่องหมายดอลลาร์ที่$
ระบุบรรทัดสุดท้ายของไฟล์
คุณสามารถลบบรรทัดเดียวที่มีหมายเลขบรรทัดโดย
sed -i '33d' file
การดำเนินการนี้จะลบบรรทัดที่หมายเลข 33 บรรทัดและบันทึกไฟล์ที่อัพเดต
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
ดังนั้นผมจึงใช้วิธีการนี้: ขอบคุณ!
และ awk เช่นกัน
awk 'NR!~/^(5|10|25)$/' file
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
นี่เป็นอาการของ Antipattern เครื่องมือที่สร้างหมายเลขบรรทัดอาจถูกแทนที่ด้วยอันที่ลบบรรทัดทันที ตัวอย่างเช่น;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
( deletelines
ยูทิลิตี้ที่คุณต้องการจินตนาการ) อยู่ที่ไหนเหมือนกัน
grep -v error logfile
ต้องบอกว่าถ้าคุณอยู่ในสถานการณ์ที่คุณต้องการทำงานนี้จริงๆคุณสามารถสร้างsed
สคริปต์อย่างง่ายจากไฟล์หมายเลขบรรทัด ตลก ( แต่บางทีอาจจะทำให้เกิดความสับสนเล็กน้อย) sed
คุณสามารถทำเช่นนี้กับ
sed 's%$%d%' linenumbers
สิ่งนี้ยอมรับไฟล์หมายเลขบรรทัดหนึ่งรายการต่อบรรทัดและสร้างหมายเลขบรรทัดเดียวกันที่d
ต่อท้ายแต่ละบรรทัด นี่เป็นsed
สคริปต์ที่ถูกต้องซึ่งเราสามารถบันทึกลงในไฟล์หรือ (ในบางแพลตฟอร์ม) ไพพ์ไปยังsed
อินสแตนซ์อื่น:
sed 's%$%d%' linenumbers | sed -f - logfile
ในบางแพลตฟอร์มsed -f
ไม่เข้าใจอาร์กิวเมนต์ตัวเลือก-
ให้หมายถึงอินพุตมาตรฐานดังนั้นคุณต้องเปลี่ยนเส้นทางสคริปต์ไปยังไฟล์ชั่วคราวและล้างมันเมื่อเสร็จแล้วหรืออาจแทนที่ lone dash ด้วย/dev/stdin
หรือ/proc/$pid/fd/1
ถ้าระบบปฏิบัติการของคุณ (หรือเชลล์ ) มีสิ่งนั้น
เช่นเคยคุณสามารถเพิ่ม-i
ก่อน-f
ตัวเลือกเพื่อให้sed
แก้ไขไฟล์เป้าหมายแทนการสร้างผลลัพธ์ในเอาต์พุตมาตรฐาน บนแพลตฟอร์ม * BSDish (รวมถึง OSX) คุณต้องระบุอาร์กิวเมนต์ที่ชัดเจน-i
เช่นกัน สำนวนที่พบบ่อยคือการให้อาร์กิวเมนต์ที่ว่างเปล่า; -i ''
.
p
แทนd
พร้อมกับตัวเลือก-n
(มันจะไม่ทำงานหากไม่มี-n
และ!d
จะไม่ทำงานเช่นกัน)
ฉันต้องการเสนอข้อสรุปทั่วไปด้วย awk
เมื่อไฟล์ถูกสร้างโดยบล็อกที่มีขนาดคงที่และบรรทัดที่จะลบถูกทำซ้ำสำหรับแต่ละบล็อก awk สามารถทำงานได้ดีในลักษณะดังกล่าว
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
ในตัวอย่างนี้ขนาดของบล็อกคือ 2000 และฉันต้องการพิมพ์บรรทัด [1..713] และ [1026..1029]
NR
เป็นตัวแปรที่ awk ใช้เพื่อจัดเก็บหมายเลขบรรทัดปัจจุบัน%
ให้ส่วนที่เหลือ (หรือโมดูลัส) ของการหารจำนวนเต็มสองจำนวนnl=((NR-1)%BLOCKSIZE)+1
ที่นี่เราเขียนในตัวแปรnlหมายเลขบรรทัดภายในบล็อกปัจจุบัน (ดูด้านล่าง)||
และ&&
มีผู้ประกอบการตรรกะหรือและและprint $0
เขียนเต็มบรรทัดWhy ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+