Saya mencoba grep -v '^$'
di Linux dan itu tidak berhasil. File ini berasal dari sistem file Windows.
Saya mencoba grep -v '^$'
di Linux dan itu tidak berhasil. File ini berasal dari sistem file Windows.
Jawaban:
Coba yang berikut ini:
grep -v -e '^$' foo.txt
The -e
pilihan 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
grep -E -v
, semuanya setelah -e
ditafsirkan sebagai polanya.
grep -v -e '^[[:space:]]*$' -e '^#' file
akan memberi Anda semua baris non-kosong, non-komentar dalam skrip atau file konfigurasi (atau tipe file apa pun yang menggunakan karakter hash untuk komentar).
-e
Opsi ini memungkinkan pola regex untuk pencocokan." Itu sangat menyesatkan . -e
adalah 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 -e
seluruhnya: grep -v '^[[:space:]]*$' foo.txt
.
Tetap sederhana.
grep . filename.txt
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"
awk
.
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
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
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.
Sama dengan jawaban sebelumnya:
grep -v -e '^$' foo.txt
Di sini, grep -e
berarti versi grep yang diperluas . '^ $' berarti tidak ada karakter antara ^ (Mulai dari baris) dan $ (akhir dari baris). '^' dan '$' adalah karakter regex.
Jadi perintah grep -v
akan mencetak semua baris yang tidak cocok dengan pola ini (Tidak ada karakter antara ^ dan $).
Dengan cara ini, baris kosong kosong dihilangkan.
-e
tidak berarti "versi perpanjangan grep", mungkin Anda bingung -E
? Manual ini dengan jelas mengatakan bahwa -e
secara 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 -i
akan menjadi alat yang tepat.
Saya berusaha keras, tetapi ini tampaknya berhasil (dengan asumsi \r
menggigit Anda di sini):
printf "\r" | egrep -xv "[[:space:]]*"
Menggunakan Perl:
perl -ne 'print if /\S/'
\S
berarti cocok dengan karakter yang tidak kosong.
egrep -v "^ \ s \ s +"
egrep sudah melakukan regex, dan ruang putih.
+ Duplikat pola saat ini.
^ Adalah awal
Menggunakan:
grep pattern filename.txt | uniq
uniq
akan mengurangi garis kosong yang bersebelahan menjadi hanya satu garis kosong, tetapi tidak menghapusnya sepenuhnya. Tetap saja, saya suka mencoba menggunakan uniq
seperti itu. Penyortiran pertama secara efektif akan menghapus semua baris kosong - hanya menyisakan satu baris, tetapi mengatur ulang urutan garis mungkin tidak dapat diterima.
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
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