Saya mencoba menghapus baris kosong menggunakan sed:
sed '/^$/d'
tapi saya tidak beruntung dengan itu.
Misalnya, saya punya baris berikut:
xxxxxx
yyyyyy
zzzzzz
dan saya ingin menjadi seperti:
xxxxxx
yyyyyy
zzzzzz
Apa yang harus menjadi kode untuk ini?
Jawaban:
Anda mungkin memiliki spasi atau tab di baris "kosong" Anda. Gunakan kelas POSIX dengan
sed
untuk menghapus semua baris yang hanya mengandung spasi putih:Versi lebih pendek yang menggunakan ERE, misalnya dengan gnu sed:
(Perhatikan bahwa sed TIDAK mendukung PCRE.)
sumber
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
^\s*$
akan cocok dengan semua baris "kosong", kosong di sini berarti, baris tidak mengandung karakter, atau baris hanya berisi string kosong (Misalnya spasi). Semua baris yang cocok akan dihapus oleh sed, dengand
perintah.Saya kehilangan
awk
solusinya:Yang akan kembali:
Bagaimana cara kerjanya? Karena
NF
singkatan dari "jumlah bidang", baris-baris yang kosong memiliki 0 fiedl, sehingga awk mengevaluasi 0 ke False dan tidak ada garis yang dicetak; Namun, jika ada setidaknya satu bidang, evaluasi adalah Benar dan membuatawk
melakukan tindakan standarnya: cetak baris saat ini.sumber
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
Apakah Anda tahu cara bagus untuk memasukkan ini ke dalam naskah-awk seperti, misalnya, sebuah pola? awk '/ mypattern / {do stuff ...}'awk 'NF {do stuff...}'
.sed '/^$/d'
harus baik-baik saja, apakah Anda berharap untuk memodifikasi file di tempatnya? Jika demikian, Anda harus menggunakan-i
bendera.Mungkin baris-baris itu tidak kosong, jadi jika itu masalahnya, lihat pertanyaan ini Hapus baris kosong dari txtfiles, hapus spasi dari awal dan akhir baris. Saya yakin itulah yang ingin Anda capai.
sumber
sed -i '/^$/d'
adalah salah satu cara untuk melakukannya.sed
'/^[[:space:]]*$/d'
'/^\s*$/d'
'/^$/d'
-n '/^\s*$/!p'
grep
.
-v '^$'
-v '^\s*$'
-v '^[[:space:]]*$'
awk
/./
'NF'
'length'
'/^[ \t]*$/ {next;} {print}'
'!/^[ \t]*$/'
sumber
[]
harus tidak akan melarikan diri dalam ekspresi braket, sehingga kode di sini adalah tidak benar untuk\[\[:space:\]\]
atau\[ \t\]
- harus[[:space:]]
dan[ \t]
.Saya percaya ini yang termudah dan tercepat:
Jika Anda perlu mengabaikan semua garis ruang putih juga maka coba ini:
Contoh:
output
sumber
cat
,grep
bawa file juga:grep . file.txt
grep '\S'
jelas tidak portabel. Jika sudah,grep -P
Anda dapat menggunakannyagrep -P '\S'
tetapi tidak didukung di semua platform.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 ^$
Dengan bantuan dari jawaban yang diterima di sini dan jawaban yang diterima di atas, saya telah menggunakan:
Ini mencakup semua pangkalan dan berfungsi dengan baik untuk kebutuhan saya. Kudos ke poster asli @Kent dan @kev
sumber
Anda bisa mengatakan:
sumber
print all lines except the empty one(s)
dan diamAnda dapat melakukan hal seperti itu menggunakan "grep" juga:
sumber
Ini bekerja dengan awk juga.
sumber
Anda kemungkinan besar melihat perilaku yang tidak terduga karena file teks Anda dibuat pada Windows, jadi urutan akhir barisnya adalah
\r\n
. Anda dapat menggunakan dos2unix untuk mengonversinya menjadi file teks gaya UNIX sebelum menjalankan atau menggunakanuntuk menghapus garis kosong apakah carriage return ada atau tidak.
sumber
-r
dilakukan flag dan apakah mungkin untuk menggabungkannya dengan-i
memodifikasi file secara langsung dan menghindari pencetakan ke layar. Selain itu, saya berpikir bahwa perintah ini juga akan berfungsi sebagaised -r "/^\r$/d"
Pilihan lain tanpa
sed
,awk
,perl
, dllstring - mencetak string karakter yang dapat dicetak dalam file.
sumber
strings
alih-alihstring
?bash
Jawaban khusus saya adalah merekomendasikan menggunakanperl
operator substitusi dengan tanda pola globalg
untuk ini, sebagai berikut:Jawaban ini menggambarkan akuntansi untuk apakah baris kosong memiliki spasi di dalamnya (
[\ ]*
), serta digunakan|
untuk memisahkan beberapa istilah / bidang pencarian. Diuji pada macOS High Sierra dan CentOS 6/7.FYI, kode asli OP
sed '/^$/d' $file
berfungsi dengan baik dibash
Terminal pada macOS High Sierra dan CentOS 6/7 Linux di cluster superkomputer berkinerja tinggi.sumber
Bagi saya dengan FreeBSD 10.1 dengan sed hanya bekerja solusi ini:
di dalamnya
[]
ada simbol spasi dan tab.file tes berisi:
sumber