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
Jawaban:
Baris sed ini harus melakukan trik:
The
-i
berarti akan mengedit file di tempat.sumber
\s*
adalah solusi yang sama yang diberikan oleh pertanyaan stackoverflowbad flag in substitute command: 'e'
grep
Solusi sederhana adalah dengan menggunakan perintah
grep
( GNU atau BSD ) seperti di bawah ini.Hapus garis kosong (tidak termasuk garis dengan spasi).
Hapus garis yang benar-benar kosong (termasuk garis dengan spasi).
Catatan: Jika Anda mendapatkan warna yang tidak diinginkan, itu artinya Anda
grep
aliasgrep --color=auto
(check bytype grep
). Dalam hal ini, Anda dapat menambahkan--color=none
parameter, 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:
atau termasuk garis dengan spasi:
Lihat juga:
sed
: Hapus baris kosong menggunakan sedawk
: Hapus baris kosong menggunakan awksumber
grep .
tampaknya menjadi solusi paling sederhana.grep .
dibandingkan dengan solusi lain adalah akan menyoroti semua teks berwarna merah. Solusi lain dapat mempertahankan warna asli. Bandingkanunbuffer apt search foo | grep .
denganunbuffer apt search foo | grep -v ^$
grep
alias adagrep --color=auto
di sistem Anda (centang oleh :)type grep
. Anda dapat menjalankannya sebagai\grep
atau menggunakan--color=none
parameter.grep --color=none .
, Anda akan mendapatkan semua teks putih, yang menimpa format warna dari perintah asli (contoh:apt search foo
)grep .
akan cocok dengan garis yang hanya berisi spasi, yang menurut OP tidak diinginkan.d adalah perintah sed untuk menghapus sebuah baris.
^$
adalah ekspresi reguler yang hanya cocok dengan baris kosong, baris mulai diikuti oleh akhir baris.sumber
Anda dapat menggunakan opsi -v dengan grep untuk menghapus baris kosong yang cocok.
Seperti ini
sumber
-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.grep -Ev '^#|^$' file.txt
Ini
awk
solusinya:Dengan Awk,
NF
hanya disetel pada baris yang tidak kosong. Ketika kondisi ini cocok, tindakan standar Awk adalah mencetak seluruh baris.sumber
Untuk menghapus garis kosong, Anda dapat menekan pengulangan baris baru dengan
tr
:sumber
xargs jika Anda tidak keberatan membuka ruang putih terkemuka
sumber
Ex / Vim
Berikut adalah metode menggunakan
ex
editor (bagian dari Vim):Untuk banyak file (edit di tempat):
Catatan:
:bufdo
Perintah ini bukan POSIX .Tanpa memodifikasi file (cukup cetak pada output standar):
sumber
Bagi saya @ martigin-heemels, perintah melempar kesalahan ini memperbaikinya (yaitu param dummy untuk saya),
sed -i '' '/^$/d' file.txt
sumber
Mungkin cara termudah untuk menghapus garis kosong (tanpa spasi) adalah dengan menggunakan
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.
sumber