ลบบรรทัดสุดท้ายออกจากไฟล์


44

ฉันใช้sed เพื่อลบบรรทัดที่มีตำแหน่งเฉพาะอย่างรวดเร็วเช่น

sed '1d'
sed '5d'

แต่ถ้าฉันต้องการลบบรรทัดสุดท้ายของไฟล์และฉันไม่รู้จำนวนเส้น (ฉันรู้ว่าฉันสามารถใช้มันwcและลูกเล่นอื่น ๆ ได้)

ขณะนี้ใช้วิธีแก้ไขด้วยheadและtailรวมกับwcสิ่งที่ต้องทำ บิดเร็ว ๆ ที่นี่?


ระบบปฏิบัติการใด? รสชาติบางอย่างมีตัวเลือกที่น่าสนใจheadและtail...
นิลส์

@ ไม่มีฉันอยู่ใน 'Red Hat Enterprise Linux Server รีลีส 5.5 (Tikanga)' คุณสามารถชี้ให้เห็นทางเลือกต่าง ๆheadและtailรู้รสชาติที่แตกต่างกันหรือไม่?
mtk

ฉันทำ. ดูด้านล่าง
นิลส์

คำตอบ:


87

in sed $เป็นบรรทัดสุดท้ายดังนั้นเพื่อลบบรรทัดสุดท้าย:

sed '$d' <file>

12
ใช้sed -i '$d' <file>เพื่อแก้ไขไฟล์ในสถานที่
WanderingMind

1
สิ่งที่จะเป็นการลบบรรทัดสุดท้ายที่ n โดยที่ n คือหมายเลขจำนวนเต็มใด ๆ
Joshua Salazar

31

$ สำหรับบรรทัดสุดท้าย:

sed '$d' file

9
เอาชนะคุณ 30 วินาที: P
h3rrmiller

1
น่าเศร้าที่ต้องใช้เทคนิคที่ซับซ้อนกว่านี้เพื่อลบพูดสองบรรทัดสุดท้าย
dubiousjim

คุณหมายถึงอะไร sed '$d' file; sed '$d' file
Rob

3
@Rob: sed '$d' fileไม่ได้แก้ไขไฟล์จริงๆ มันแค่พิมพ์เนื้อหาของไฟล์ลบบรรทัดสุดท้าย ดังนั้นsed '$d' file; sed '$d' fileจะพิมพ์เนื้อหาของไฟล์สองครั้งลบบรรทัดสุดท้ายในแต่ละครั้ง ลบที่ผ่านมาสองเส้นเทียบเท่ามีsed '$d' file sed '$d' file | sed '$d'
ruakh

2
ใช่มันไม่งดงาม แต่แน่นอนว่ามันใช้งานได้ sed -n '1{h;n;}; $q; x; p;'ฉันจะทำในหนึ่งผ่านด้วย ฉันมุ่ยว่าเราทำไม่sed '$-1,$d'ได้
dubiousjim

14

cat file.txt | head -n -1 > new_file.txt

ระวังดูเหมือนขึ้นอยู่กับบรรทัดสุดท้ายของfile.txt(หากลงท้ายด้วยEOFหรือ\nแล้วEOF) จำนวนบรรทัดในnew_file.txtอาจจะเท่ากัน (เป็นfile.txt) หลังจากคำสั่งนี้ (เกิดขึ้นเมื่อไม่มี\n) - ในกรณีใด ๆ เนื้อหาของบรรทัดสุดท้ายจะถูกลบ

นอกจากนี้โปรดทราบว่าคุณต้องใช้ไฟล์ที่สอง (ระดับกลาง) หากคุณ cat และเปลี่ยนเส้นทางไปที่ไฟล์เดียวกันคุณจะลบมัน


6
head -n -1 file.txt > new_file.txtไหนงานนี้มันก็อาจจะเพียงแค่ โปรดทราบว่าการนับจำนวนลบจะhead -nมีให้สำหรับการใช้งานบางอย่างheadเท่านั้น ยกตัวอย่างเช่นมันไม่ทำงานสำหรับ FreeBSD หรือสำหรับรุ่น BusyBox headของ
dubiousjim

1
@dubiousjim: เห็นด้วยhead -n -1 file.txt > new_file.txtดีกว่า มันทำงานในลักษณะเดียวกันกับความคิดเห็นของฉันทั้งสอง (จำนวนบรรทัดเท่ากันและลบในไฟล์เดียวกัน) สำหรับข้อโต้แย้งเชิงลบความแตกต่างดังกล่าวเกิดขึ้นเป็นครั้งคราวระหว่าง Unixes และพวกเขามักจะหงุดหงิดเพราะคุณคาดว่ามันจะเป็นคำสั่งเดียวกันทั้งหมด (และทำไมคุณไม่ - ชื่อและจุดประสงค์เดียวกัน!) จุด. (ฉันใช้ Debian)
Emanuel Berg

5

head --lines=-1. ฉันสะดุดความเป็นไปได้นี้เป็นครั้งแรกใน man-page เพื่อมุ่งหน้าไปยัง SLES11SP2-system (coreutils-8.12-6.23.1)

tailและheadเป็นส่วนหนึ่งของcoreutils-rpm (อย่างน้อยสำหรับ rpm-based-systems)

ตามการเปลี่ยนแปลงของ coreutils ไวยากรณ์นี้ได้รับการสนับสนุนตั้งแต่ coreutils รุ่น 5.0.1

ข่าวร้าย: ตาม RH5-man-page ตัวเลือกนี้ไม่ได้อธิบาย

ข่าวดี: ใช้งานได้กับ RH5 (ในกรณีของคุณ: ใช้งานได้ - อย่างน้อยกับรุ่นปัจจุบันของ RH5)

rpm -q coreutils แสดงให้ฉันเห็น (บน CentOS 5.8): coreutils-5.97-34.el5_8.1

ฉันไม่แน่ใจว่า RH5.5 มี coreutils-version ที่รองรับอยู่แล้ว แต่ 5.5 มี EoLed อยู่แล้ว


+1 มันทำงานได้อย่างสมบูรณ์แบบบน RH5.5 ขอบคุณ
mtk

0

ลินุกซ์

$ คือบรรทัดสุดท้าย, d สำหรับลบ:

sed '$d' ~/path/to/your/file/name

MacOS

เทียบเท่ากับ sed-i

sed -i '' -e '$ d' ~/path/to/your/file/name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.