ฉันต้องการลบบรรทัดว่างทั้งหมดออกจากไฟล์ แม้ว่าบรรทัดนั้นจะมีช่องว่างหรือแท็บก็ควรจะลบออก
ฉันต้องการลบบรรทัดว่างทั้งหมดออกจากไฟล์ แม้ว่าบรรทัดนั้นจะมีช่องว่างหรือแท็บก็ควรจะลบออก
คำตอบ:
เพียงแค่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
$
สายหรือไม่?