วิธีลบบรรทัดว่าง / ว่างออกจากไฟล์ใน Unix (รวมถึงช่องว่าง)?


60

ฉันจะลบบรรทัดว่าง / ว่าง (รวมถึงช่องว่างเท่านั้น) ในไฟล์ใน Unix / Linux โดยใช้บรรทัดคำสั่งได้อย่างไร

เนื้อหาของ file.txt

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

ผลลัพธ์ที่ต้องการ

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD



1
นี่เป็นคำตอบที่ยิ่งใหญ่ที่จะช่วยแก้ปัญหาโดยใช้ grep, sed, awk: stackoverflow.com/questions/16414410/…
wisbucky

คำตอบ:


86

บรรทัด sed นี้ควรทำเคล็ดลับ:

sed -i '/^$/d' file.txt

-iหมายจะแก้ไขมันแฟ้มใน-สถานที่


13
ที่จริงแล้วต้องเป็น "/ ^ * $ / d" เพื่อลบบรรทัดที่มีช่องว่างเท่านั้น
Sean Reifschneider

2
@SeanReifschneider ข้อกำหนดนั้นไม่ได้อยู่ในคำถามเมื่อคำตอบนี้ถูกเขียน?
kasperd

4
@SeanReifschneider จะ "/ ^ \ s * $ / d" จะไม่ดีขึ้นเพราะมันจะรวมแท็บ? แม้ว่ามันจะไม่ได้กล่าวถึงในโพสต์ต้นฉบับ แต่ดูเหมือนว่าเป็นตัวเลือกที่ดีกว่าสำหรับฉัน
mrswadge


ฉันได้รับbad flag in substitute command: 'e'
ishandutta2007

29

grep

วิธีแก้ปัญหาอย่างง่ายคือโดยใช้grep( GNUหรือBSD ) คำสั่งดังต่อไปนี้

  • ลบบรรทัดว่าง (ไม่รวมบรรทัดที่มีช่องว่าง)

    grep . file.txt
    
  • ลบบรรทัดว่างทั้งหมด (รวมถึงบรรทัดที่มีช่องว่าง)

    grep "\S" file.txt
    

หมายเหตุ: หากคุณได้สีที่ไม่ต้องการนั่นหมายถึงว่าคุณgrepเป็นนามแฝงgrep --color=auto(ตรวจสอบโดยtype grep) ในกรณีนั้นคุณสามารถเพิ่ม--color=noneพารามิเตอร์หรือเพียงแค่เรียกใช้คำสั่งเป็น\grep(ซึ่งไม่สนใจนามแฝง)


ripgrep

คล้ายกับripgrep(เหมาะสำหรับไฟล์ที่มีขนาดใหญ่กว่ามาก)

ลบบรรทัดว่างที่ไม่รวมบรรทัดด้วยช่องว่าง:

rg -N . file.txt

หรือรวมถึงบรรทัดที่มีช่องว่าง:

rg -N "\S" file.txt

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


2
grep .น่าจะเป็นทางออกที่ง่ายที่สุด
Leo

ข้อเสียของการgrep .เปรียบเทียบกับโซลูชั่นอื่น ๆ คือมันจะเน้นข้อความทั้งหมดในสีแดง โซลูชันอื่น ๆ สามารถคงสีดั้งเดิมไว้ได้ เปรียบเทียบunbuffer apt search foo | grep .กับunbuffer apt search foo | grep -v ^$
wisbucky

1
@wisbucky คุณเห็นสีเพราะgrepใช้นามแฝงgrep --color=autoในระบบของคุณ (ตรวจสอบโดย: type grep) คุณสามารถเรียกใช้เป็น\grepหรือใช้--color=noneพารามิเตอร์
kenorb

@kenorb ถ้าคุณใช้grep --color=none .คุณจะได้รับข้อความสีขาวทั้งหมดซึ่งแทนที่การจัดรูปแบบสีของคำสั่งเดิม (ตัวอย่าง: apt search foo)
wisbucky

grep .จะจับคู่บรรทัดที่มีช่องว่างเท่านั้นซึ่ง OP บอกว่าไม่ต้องการ
Jim L.

27
sed '/^$/d' file.txt

d คือคำสั่ง sed เพื่อลบบรรทัด ^$เป็นนิพจน์ทั่วไปที่จับคู่เฉพาะบรรทัดว่างเริ่มต้นบรรทัดตามด้วยสิ้นสุดบรรทัด


+1 สำหรับคำอธิบาย
Alex Raj Kaliamoorthy

คำสั่งนี้ไม่ได้สร้างเอาต์พุตเดียวกันกับที่ OP ร้องขอ (มันสร้างได้ 5 บรรทัดไม่ใช่ 4)
kenorb

22

คุณสามารถใช้อ็อพชัน -v ด้วย grep เพื่อลบบรรทัดว่างที่ตรงกัน

แบบนี้

grep -Ev "^$" file.txt

4
ฉันไม่เชื่อว่าคุณต้องการ-Eอย่างน้อยไม่ใช่กับ grep GNU แต่นอกเหนือจากที่ฉันยินดีที่จะเห็นสิ่งนี้ทำกับ grep! มันเป็นสิ่งที่ฉันเอื้อมถึงเพื่อที่จะชอบทุกครั้ง ตัวกรองในบรรทัดดูเหมือนว่าฉันจะดีกว่าตัวแก้ไขในบรรทัด
MadHatter

หากคุณต้องการข้ามความคิดเห็นและบรรทัดว่างเปล่าโดยเฉพาะอย่างยิ่งในขณะที่จัดการกับไฟล์ conf ใช้grep -Ev '^#|^$' file.txt
Govind Kailas

7

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

awk NF file.txt

ด้วย Awk ให้NFตั้งค่าบนบรรทัดที่ไม่ว่างเท่านั้น เมื่อเงื่อนไขนี้ตรงกับการดำเนินการเริ่มต้นของ Awk คือพิมพ์ทั้งบรรทัด


6

ในการลบบรรทัดว่างคุณสามารถบีบบรรทัดใหม่ด้วยtr:

cat file.txt | tr -s '\n' '\n'

สิ่งนี้สร้าง 6 บรรทัดไม่ใช่ 4 ตามที่ร้องขอ OP
kenorb


0

Ex / กลุ่ม

นี่คือวิธีการใช้exโปรแกรมแก้ไข (ส่วนหนึ่งของ Vim):

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

สำหรับฉัน @ martigin-heemels คำสั่งถูกโยนข้อผิดพลาดนี้แก้ไขได้ (เช่นหุ่นจำลองให้ฉัน)

sed -i '' '/^$/d' file.txt


0

อาจเป็นวิธีที่ง่ายที่สุดในการลบบรรทัดว่าง (โดยไม่มีช่องว่าง) คือการใช้cat -s:

$ cat -s file
$ some-command | cat -s

อย่างน้อยถ้าคุณไม่ต้องการแก้ไขไฟล์แบบแทนที่ แต่เช่นเขียนไปที่เทอร์มินัลแทน นอกจากนี้มันไม่เกี่ยวข้องกับธุรกิจ regex ตลก ๆ ดังนั้นจึงเป็นเรื่องง่ายที่จะจดจำแม้กระทั่งสำหรับคนที่ไม่เป็นมิตร


จากman cat:

-s, --squeeze-blank never more than one single blank line

อาจแตกต่างกันในระบบปฏิบัติการที่แตกต่างกัน แต่มีอยู่ใน Linuxes และ OpenBSD ไม่กี่ครั้งที่ฉันตรวจสอบครั้งล่าสุด

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