Bagaimana menghapus baris kosong / kosong dari file di Unix (termasuk spasi)?

61

Bagaimana cara menghapus baris kosong / kosong (hanya spasi) dalam file di Unix / Linux menggunakan baris perintah?

isi file.txt

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

output yang diinginkan

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD
Michael Ellick Ang
sumber
1
Ini adalah jawaban epik yang cukup banyak memberikan setiap solusi yang mungkin menggunakan grep, sed, awk: stackoverflow.com/questions/16414410/…
wisbucky

Jawaban:

87

Baris sed ini harus melakukan trik:

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

The -iberarti akan mengedit file di tempat.

Martijn Heemels
sumber
13
Sebenarnya perlu "/ ^ * $ / d" untuk menghapus baris yang hanya berisi spasi.
Sean Reifschneider
2
@SeanReifschneider Persyaratan itu tidak ada dalam pertanyaan ketika jawaban ini ditulis?
kasperd
4
@SeanReifschneider Apakah "/ ^ \ s * $ / d" tidak lebih baik karena akan menyertakan tab? Meskipun tidak disebutkan di pos asli, tampaknya pilihan yang lebih kuat bagi saya.
mrswadge
Saya mendapatkanbad flag in substitute command: 'e'
ishandutta2007
31

grep

Solusi sederhana adalah dengan menggunakan perintah grep( GNU atau BSD ) seperti di bawah ini.

  • Hapus garis kosong (tidak termasuk garis dengan spasi).

    grep . file.txt
    
  • Hapus garis yang benar-benar kosong (termasuk garis dengan spasi).

    grep "\S" file.txt
    

Catatan: Jika Anda mendapatkan warna yang tidak diinginkan, itu artinya Anda grepalias grep --color=auto(check by type grep). Dalam hal ini, Anda dapat menambahkan --color=noneparameter, atau menjalankan perintah sebagai \grep(yang mengabaikan alias).


ripgrep

Mirip dengan ripgrep(cocok untuk file yang jauh lebih besar).

Hapus garis kosong tidak termasuk garis dengan spasi:

rg -N . file.txt

atau termasuk garis dengan spasi:

rg -N "\S" file.txt

Lihat juga:

kenorb
sumber
2
grep .tampaknya menjadi solusi paling sederhana.
Leo
Kelemahan dari grep .dibandingkan dengan solusi lain adalah akan menyoroti semua teks berwarna merah. Solusi lain dapat mempertahankan warna asli. Bandingkan unbuffer apt search foo | grep .denganunbuffer apt search foo | grep -v ^$
wisbucky
1
@wisbucky Anda melihat warna, karena grepalias ada grep --color=autodi sistem Anda (centang oleh :) type grep. Anda dapat menjalankannya sebagai \grepatau menggunakan --color=noneparameter.
kenorb
@kenorb Jika Anda menggunakan grep --color=none ., Anda akan mendapatkan semua teks putih, yang menimpa format warna dari perintah asli (contoh: apt search foo)
wisbucky
grep .akan cocok dengan garis yang hanya berisi spasi, yang menurut OP tidak diinginkan.
Jim L.
27
sed '/^$/d' file.txt

d adalah perintah sed untuk menghapus sebuah baris. ^$adalah ekspresi reguler yang hanya cocok dengan baris kosong, baris mulai diikuti oleh akhir baris.

Kamil Kisiel
sumber
+1 untuk penjelasan
Alex Raj Kaliamoorthy
Perintah ini tidak menghasilkan output yang sama seperti yang diminta OP (menghasilkan 5 baris, bukan 4).
kenorb
22

Anda dapat menggunakan opsi -v dengan grep untuk menghapus baris kosong yang cocok.

Seperti ini

grep -Ev "^$" file.txt
jdabney
sumber
4
Saya tidak percaya Anda membutuhkan -E, setidaknya tidak dengan GNU grep, tetapi selain itu saya sangat senang melihat ini dilakukan dengan grep! Itu yang saya raih dalam preferensi untuk sed, setiap kali; Filter in-line menurut saya lebih baik daripada editor in-line.
MadHatter
Jika Anda ingin melewatkan baris komentar dan kosong, terutama saat berurusan dengan file conf gunakangrep -Ev '^#|^$' file.txt
Govind Kailas
7

Ini awksolusinya:

awk NF file.txt

Dengan Awk, NFhanya disetel pada baris yang tidak kosong. Ketika kondisi ini cocok, tindakan standar Awk adalah mencetak seluruh baris.

Steven Penny
sumber
6

Untuk menghapus garis kosong, Anda dapat menekan pengulangan baris baru dengan tr:

cat file.txt | tr -s '\n' '\n'
siddhadev
sumber
Ini menghasilkan 6 baris, bukan 4 seperti yang diminta OP.
kenorb
1

xargs jika Anda tidak keberatan membuka ruang putih terkemuka

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four
calloway christian
sumber
0

Ex / Vim

Berikut adalah metode menggunakan exeditor (bagian dari Vim):

ex -s +'v/\S/d' -cwq test.txt

Untuk banyak file (edit di tempat):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Catatan: :bufdoPerintah ini bukan POSIX .

Tanpa memodifikasi file (cukup cetak pada output standar):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
kenorb
sumber
0

Bagi saya @ martigin-heemels, perintah melempar kesalahan ini memperbaikinya (yaitu param dummy untuk saya),

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

ishandutta2007
sumber
0

Mungkin cara termudah untuk menghapus garis kosong (tanpa spasi) adalah dengan menggunakan cat -s:

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

Setidaknya jika Anda tidak ingin mengedit file di tempat tetapi misalnya menulis ke terminal saja. Juga, itu tidak melibatkan bisnis regex lucu sehingga sangat mudah diingat bahkan untuk orang yang tidak ramah RE.


Dari man cat:

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

Mungkin berbeda pada OS yang berbeda tetapi hadir di beberapa Linux dan OpenBSD terakhir kali saya periksa.

kyrill
sumber