Hapus garis kosong dengan grep

164

Saya mencoba grep -v '^$'di Linux dan itu tidak berhasil. File ini berasal dari sistem file Windows.

simpul ninja
sumber

Jawaban:

300

Coba yang berikut ini:

grep -v -e '^$' foo.txt

The -epilihan memungkinkan pola regex untuk pencocokan.

Kutipan tunggal di sekitar ^$membuatnya bekerja untuk Cshell. Kerang lain akan senang dengan tanda kutip tunggal atau ganda.

UPDATE: Ini berfungsi bagi saya untuk file dengan garis kosong atau "semua ruang putih" (seperti garis jendela dengan ujung garis gaya "\ r \ n"), sedangkan di atas hanya menghapus file dengan garis kosong dan ujung garis unix gaya:

grep -v -e '^[[:space:]]*$' foo.txt
ars
sumber
Egrep itu hanya akan berfungsi untuk file dengan nol atau 1 spasi di telepon, bukan untuk file dengan 2 atau lebih spasi. Ubah ke *.
Ed Morton
4
Ini seharusnya grep -E -v, semuanya setelah -editafsirkan sebagai polanya.
jazzpi
6
grep -v -e '^[[:space:]]*$' -e '^#' fileakan memberi Anda semua baris non-kosong, non-komentar dalam skrip atau file konfigurasi (atau tipe file apa pun yang menggunakan karakter hash untuk komentar).
palswim
" -eOpsi ini memungkinkan pola regex untuk pencocokan." Itu sangat menyesatkan . -eadalah definisi (POSIX-) untuk: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).(dari manual ). Grep sudah mengharapkan ekspresi reguler (dasar) secara default. Untuk pola ini, Anda dapat meninggalkan keluar -eseluruhnya: grep -v '^[[:space:]]*$' foo.txt.
Yeti
73

Tetap sederhana.

grep . filename.txt
Frej Connolly
sumber
1
ini memberi saya semua baris dalam file
phuclv
2
@ LưuVĩnhPhúc Seharusnya menampilkan semua baris dalam file kecuali baris kosong.
Frej Connolly
2
Ini berfungsi untuk saya pada file dari sistem berbasis linux tetapi tidak pada file dari Windows. Mungkin karena karakter akhir baris Windows.
Saya memperbaiki ini meskipun tidak cukup menyelesaikan masalah OP dalam menangani file dengan ujung jalur Windows, tetapi karena saya tidak memiliki masalah itu, ini ternyata menjadi solusi yang sempurna bagi saya.
David Z
1
Ini solusi sempurna. Sederhana dan bekerja di Linux.
W00f
30

Menggunakan:

$ dos2unix file
$ grep -v "^$" file

Atau cukup awk:

awk 'NF' file

Jika Anda tidak memiliki dos2unix, maka Anda dapat menggunakan alat seperti tr :

tr -d '\r' < "$file" > t ; mv t "$file"
ghostdog74
sumber
Tidak dapat menemukan dos2unix program. Apakah itu untuk Windows? perintah ask juga tidak berfungsi.
node ninja
meminta? Bukan itu awk.
iconoclast
Poin bagus tentang mengonversi ke akhiran gaya UNIX jika tidak, ekspresi reguler mungkin tidak berfungsi seperti yang diharapkan. Tidak ada yang bekerja di sini sampai saya mengubah akhir baris.
Ryan H.
16
grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

Menjalankan kode-

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

Untuk memahami lebih lanjut tentang bagaimana / mengapa ini bekerja, saya sarankan membaca ekspresi reguler. http://www.regular-expressions.info/tutorial.html

Sepero
sumber
2
Bagaimana dan mengapa ini bekerja? Jawaban Anda akan jauh lebih baik jika Anda bisa menjelaskannya. Misalnya ekspresi reguler Anda cocok dengan awal string, kemudian satu atau lebih spasi menggunakan standar POSIX kemudian akhir string, yaitu dengan grep -v menghapus semua baris yang hanya spasi. Baik? Apa yang terjadi jika tidak ada ruang; itu hanya karakter baris baru?
Ben
Seperti contoh saya menunjukkan, bahkan hanya baris kosong yang dihapus (baris pertama). Saya menambahkan lebih banyak informasi, jadi semoga itu membantu. :)
Sepero
3

Saya lebih suka menggunakan egrep, meskipun dalam pengujian saya dengan file asli dengan garis kosong pendekatan Anda bekerja dengan baik (meskipun tanpa tanda kutip dalam pengujian saya). Ini juga berhasil:

egrep -v "^(\r?\n)?$" filename.txt
chryss
sumber
Sudah mencobanya. Garis kosong masih ditampilkan. Mungkinkah ini karena file itu dibuat di Windows?
node ninja
3

Jika Anda memiliki urutan beberapa baris kosong dalam satu baris, dan hanya ingin satu baris kosong per urutan, cobalah

grep -v "unwantedThing" foo.txt | cat -s

cat -s menekan jalur output kosong berulang.

Output Anda akan mulai dari

match1



match2

untuk

match1

match2

Tiga baris kosong dalam output asli akan dikompresi atau "diperas" menjadi satu baris kosong.

Senol Erdogan
sumber
2
awk 'NF' file-with-blank-lines > file-with-no-blank-lines
Tim
sumber
2

Sama dengan jawaban sebelumnya:

grep -v -e '^$' foo.txt

Di sini, grep -eberarti versi grep yang diperluas . '^ $' berarti tidak ada karakter antara ^ (Mulai dari baris) dan $ (akhir dari baris). '^' dan '$' adalah karakter regex.

Jadi perintah grep -vakan mencetak semua baris yang tidak cocok dengan pola ini (Tidak ada karakter antara ^ dan $).

Dengan cara ini, baris kosong kosong dihilangkan.

FatherMathew
sumber
-etidak berarti "versi perpanjangan grep", mungkin Anda bingung -E? Manual ini dengan jelas mengatakan bahwa -esecara eksplisit mengatakan bahwa sebuah pola mengikuti. Karena pola tidak dimulai dengan tanda hubung, dan Anda hanya mendefinisikan satu pola saja, Anda mungkin juga membiarkannya karena secara default grep mengharapkan satu pola regex: grep -v '^$' foo.txt(tidak perlu fungsi regex yang diperluas). Juga perlu disebutkan bahwa ini tidak menghilangkan baris kosong dalam file, hanya yang disalurkan melalui output. Untuk itu, sed -iakan menjadi alat yang tepat.
Yeti
1

Saya berusaha keras, tetapi ini tampaknya berhasil (dengan asumsi \rmenggigit Anda di sini):

printf "\r" | egrep -xv "[[:space:]]*"
mvds
sumber
Itu berfungsi jika saya mengganti bagian pertama dengan output dari file.
node ninja
0

Menggunakan Perl:

perl -ne 'print if /\S/'

\S berarti cocok dengan karakter yang tidak kosong.

Majid Azimi
sumber
0

egrep -v "^ \ s \ s +"

egrep sudah melakukan regex, dan ruang putih.

+ Duplikat pola saat ini.

^ Adalah awal

Jonni2016aa
sumber
0

Menggunakan:

grep pattern filename.txt | uniq
baitisj
sumber
uniqakan mengurangi garis kosong yang bersebelahan menjadi hanya satu garis kosong, tetapi tidak menghapusnya sepenuhnya. Tetap saja, saya suka mencoba menggunakan uniqseperti itu. Penyortiran pertama secara efektif akan menghapus semua baris kosong - hanya menyisakan satu baris, tetapi mengatur ulang urutan garis mungkin tidak dapat diterima.
Zach Young
Poin yang bagus. Ini juga akan mengejar garis yang berulang. Saya kira solusi saya memperkenalkan bug.
baitisj
0

Berikut ini cara lain untuk menghilangkan garis putih dan garis yang dimulai dengan #tanda. Saya pikir ini cukup berguna untuk membaca file konfigurasi.

[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
stack ALL=(ALL) NOPASSWD: ALL
lauc.exon.nod
sumber
0

Memang benar bahwa penggunaan grep -v -e '^ $' dapat bekerja, namun itu tidak menghapus baris kosong yang memiliki 1 ruang atau lebih di dalamnya . Saya menemukan jawaban termudah dan paling sederhana untuk menghapus baris kosong adalah penggunaan awk . Berikut ini adalah sedikit dimodifikasi dari orang-orang awk di atas:

awk 'NF' foo.txt

Tetapi karena pertanyaan ini adalah untuk menggunakan grep saya akan menjawab yang berikut:

grep -v '^ *$' foo.txt

Catatan : ruang kosong antara ^ dan *.

Atau Anda dapat menggunakan \ s untuk mewakili ruang kosong seperti ini:

grep -v '^\s*$' foo.txt
MarcT
sumber