วิธีลบบรรทัดว่างออกจากไฟล์ (รวมถึงแท็บและช่องว่าง)?


คำตอบ:


26

เพียงแค่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:]]หมายถึงตัวละครใด ๆ แต่ตัวที่ว่างเปล่า


1
ควรจะมีการวาง$สายหรือไม่?
Michael Durrant

@MichaelDurrant มันไม่ได้ทอดสมอในด้านใดด้านหนึ่ง
jordanm

1
@MichaelDurrant [^[:blank:]]$จะจับคู่บรรทัดที่ลงท้ายด้วยแบบไม่ว่างเปล่าเท่านั้น เราต้องการลายเส้นที่ไม่เว้นว่างในที่ใดก็ได้
Stéphane Chazelas

@StephaneChazelas ฉันลอง grep [: blank:] SOURCEFILE แม้คำสั่งนี้ใช้งานได้ ฉันเข้าใจว่า [] สำหรับคลาสตัวละครคุณสามารถให้ความเห็นเกี่ยวกับวิธีการใช้งานได้ไหม ตัวอย่าง: ว่างเปล่า: ยังใหม่สำหรับฉัน
Jamshed Ansari ผู้ใช้ 3000272

มีกรณีใดบ้างที่grep -E '\S'ไม่สามารถใช้งานได้?
terdon

21

นี่คือawkทางออก:

$ awk NF file

ด้วยawk, NFการตั้งค่าเฉพาะในสายที่ไม่ว่างเปล่า เมื่อเงื่อนไขนี้ตรงกับawkการดำเนินการเริ่มต้นที่printจะพิมพ์ทั้งบรรทัด


เรียบร้อยแล้วจะลบบรรทัดที่มีช่องว่างออกด้วย
wisbucky

7

เกี่ยวกับ:

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


4
[[:space:]]รวมถึงแท็บ ถ้าไม่ใช่ regex ของคุณก็จะล้มเหลวหากมีช่องว่างตามมาด้วยแท็บ
จอร์แดน

กระบวนการwctype(3)และisalpha(3)manpages อธิบายว่าอักขระคลาสใดจะตรงกัน
จอร์แดน

คุณอาจต้องการลบอันแรกที่ไม่ตอบคำถาม
Stéphane Chazelas

@MichaelDurrant คุณช่วยเขียนสิ่งที่เกี่ยวกับ [[: blank:]] ได้ไหม?
Jamshed Ansari 3000272

เพิ่มข้อมูลสำหรับ [[: blank ::]] แล้ว Stephane ทำไมงานแรกไม่ได้ ฉันคิดว่า // ในตอนท้ายจะแทนที่บรรทัดโดยไม่มีอะไร
Michael Durrant

4

คุณสามารถใช้sedคำสั่งสำหรับลบบรรทัดว่าง:

sed '/^$/d' in > out

คำสั่งนี้จะลบบรรทัดว่างทั้งหมดออกจากไฟล์ "ใน"


แต่นั่นไม่ได้ลบบรรทัดที่มีพื้นที่และแท็บเท่านั้นตามที่ร้องขอโดยเฉพาะ
dave_thompson_085

3

ดูเหมือนว่าฉันพบว่าไม่เร็ว แต่ตลกในที่สุด:

| xargs -L1


1
สั้นดี แต่มีประโยชน์มากกว่า: ลบช่องว่างและแท็บนำออกด้วย
jringoot

โอ้พบว่ามันมีความสามารถมากยิ่งขึ้น? - ดี! ;-P
poige

1
และตัดบรรทัด (ค่าเริ่มต้นที่ 1024 ตัวอักษร) ดู manpages: linux.die.net/man/1/xargs
jringoot

ฉันตกหลุมรักเครื่องมือง่ายๆมาก ๆ 11)
poige

0

ลองใช้อดีต :

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


0

ใช้คำสั่งต่อไปนี้:

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

ดูสิ่งนี้ด้วย:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.