ฉันต้องการลบบรรทัดว่างทั้งหมดออกจากไฟล์ แม้ว่าบรรทัดนั้นจะมีช่องว่างหรือแท็บก็ควรจะลบออก
ฉันต้องการลบบรรทัดว่างทั้งหมดออกจากไฟล์ แม้ว่าบรรทัดนั้นจะมีช่องว่างหรือแท็บก็ควรจะลบออก
คำตอบ:
เพียงแค่grepสำหรับผู้ที่ไม่ใช่ช่องว่าง:
grep '[^[:blank:]]' < file.in > file.out
[:blank:]ภายในช่วงอักขระ ( [...]) เรียกว่าคลาสอักขระ POSIX มีบางอย่างที่เหมือน[:alpha:]กัน[:digit:]... [:blank:]ตรงกับพื้นที่สีขาวแนวนอน (ใน POSIX โลแคลนั่นคือช่องว่างและแท็บ แต่ในโลแคลอื่นอาจมีมากกว่านั้นเช่นอักขระระยะห่างแนวนอน Unicode ทั้งหมดในโลแคล UTF8) ในขณะที่[[:space:]]ตรงกับแนวนอนและแนวตั้งสีขาว อักขระช่องว่าง (เช่นเดียว[:blank:]กับสิ่งบวกเช่นแท็บแนวตั้งฟีดแบบฟอร์ม ... )
grep '[:blank:]'
จะกลับมาเส้นใด ๆ ที่มีตัวละคร, :, b, l, a, หรือn kคลาสของตัวละครได้รับการยอมรับเฉพาะภายใน[...]และ^ภายใน[...]คัดค้านชุด ดังนั้น[^[:blank:]]หมายถึงตัวละครใด ๆ แต่ตัวที่ว่างเปล่า
[^[:blank:]]$จะจับคู่บรรทัดที่ลงท้ายด้วยแบบไม่ว่างเปล่าเท่านั้น เราต้องการลายเส้นที่ไม่เว้นว่างในที่ใดก็ได้
grep -E '\S'ไม่สามารถใช้งานได้?
นี่คือawkทางออก:
$ awk NF file
ด้วยawk, NFการตั้งค่าเฉพาะในสายที่ไม่ว่างเปล่า เมื่อเงื่อนไขนี้ตรงกับawkการดำเนินการเริ่มต้นที่printจะพิมพ์ทั้งบรรทัด
เกี่ยวกับ:
sed -e 's/^[[:blank:]]*$//' source_file > newfile
หรือ
sed -e '/^[[:blank:]]*$/d' source_file > newfile
กล่าวคือ
สำหรับแต่ละบรรทัดให้ทดแทน:
^")[[:blank:]]") เป็นศูนย์หรือมากกว่าครั้ง (" *")$")ข้อมูลเพิ่มเติมเกี่ยวกับ :: blank :: และตัวอักษรพิเศษอื่น ๆ ที่http://www.zytrax.com/tech/web/regex.htm#special
[[:space:]]รวมถึงแท็บ ถ้าไม่ใช่ regex ของคุณก็จะล้มเหลวหากมีช่องว่างตามมาด้วยแท็บ
wctype(3)และisalpha(3)manpages อธิบายว่าอักขระคลาสใดจะตรงกัน
คุณสามารถใช้sedคำสั่งสำหรับลบบรรทัดว่าง:
sed '/^$/d' in > out
คำสั่งนี้จะลบบรรทัดว่างทั้งหมดออกจากไฟล์ "ใน"
ดูเหมือนว่าฉันพบว่าไม่เร็ว แต่ตลกในที่สุด:
| xargs -L1
ลองใช้อดีต :
ex -s +'v/\S/d' -cwq test.txt
สำหรับหลายไฟล์ (แก้ไขแบบแทนที่):
ex -s +'bufdo!v/\S/d' -cxa *.txt
หมายเหตุ: :bufdoคำสั่งไม่POSIX
โดยไม่ต้องแก้ไขไฟล์ (เพียงพิมพ์บนเอาต์พุตมาตรฐาน):
cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
ใช้คำสั่งต่อไปนี้:
grep '\S' FILE
ซึ่งจะลบบรรทัดทั้งหมดรวมถึงช่องว่างหรือแท็บ
มิฉะนั้นการลบจะไม่รวมบรรทัดที่มีช่องว่าง / แท็บให้ใช้:
grep . FILE
ตัวอย่างเช่น:
$ printf "line1\n\nline2\n \nline3\n" > FILE
$ cat -v FILE
line1
line2
line3
$ grep '\S' FILE
line1
line2
line3
$ grep . FILE
line1
line2
line3
ดูสิ่งนี้ด้วย:
sed: ลบบรรทัดว่างโดยใช้ sedawk: ลบบรรทัดว่างโดยใช้ awk
$สายหรือไม่?