Saya punya dokumen dengan banyak baris kosong.
Bagaimana saya bisa menghapusnya ketika ada 2 atau lebih bersama-sama.
Saya mencoba sed "s/\n\n//"
mengajukan tetapi tidak berhasil. Tidak ada kesalahan
Saya punya dokumen dengan banyak baris kosong.
Bagaimana saya bisa menghapusnya ketika ada 2 atau lebih bersama-sama.
Saya mencoba sed "s/\n\n//"
mengajukan tetapi tidak berhasil. Tidak ada kesalahan
Jawaban:
Hanya untuk menghapus baris kosong:
sed '/^$/d'
sed
berorientasi garis, jadi berpikir dalam istilah "2 atau lebih byte tertentu" berfungsi kecuali bila byte tersebut adalah baris baru. Maka Anda harus memikirkan sesuatu yang bekerja untuk seluruh lini.
sed
mampu menangani beberapa baris melalui fitur "pola ruang" / "ruang tahan". Tapi saya merasa itu terlalu rumit. ;-)
1!
(cocok dengan semua kecuali baris 1), demikian: sed '1!{/^$/d'}
.
sed
. Membuat file pada dasarnya akan menghapus file apa pun yang ada dengan nama yang sama. sed '/^&/d' file.txt > otherfile.txt
akan bekerja.
Tidak perlu sed
. grep
akan melakukan:
grep .
(itu grep
, SPC, dot, yang cocok dengan baris mana pun yang mengandung setidaknya satu karakter).
Ada juga:
tr -s '\n'
(peras urutan karakter baris baru menjadi satu).
Seperti dicatat oleh Chris, keduanya tidak sama karena menghapus baris kosong (seperti solusi pertama di atas dan sebagian besar jawaban lainnya fokus di sini) tidak sama dengan memeras urutan karakter baris baru seperti yang diminta dalam kasus di mana baris pertama kosong seperti itu hanya membutuhkan satu karakter baris baru untuk membuat baris pertama kosong.
Setelah melihat jawaban @Bruce Ediger sed
bukan alat terbaik untuk itu, karena itu berbasis garis dan memperlakukan \n
sebagai karakter end-of-line ini jadi rumit.sed
mungkin merupakan alat yang sempurna untuk pekerjaan itu, tetap, berikut adalah beberapa opsi lain:
Perl
perl -ne 'print if /./' file.txt
atau
perl -pe '$/=""; s/\n+/\n/;' file.txt
Terima kasih kepada @ruakh yang membuat saya pergi dan membaca ini :
$ /
Pemisah rekaman input, baris baru secara default. Ini memengaruhi gagasan Perl tentang "garis" itu. Bekerja seperti variabel RS awk, termasuk memperlakukan baris kosong sebagai terminator jika diatur ke string nol (baris kosong tidak dapat berisi spasi atau tab). Anda dapat mengaturnya ke string multi-karakter untuk mencocokkan terminator multi-karakter, atau undef untuk membaca sampai akhir file. Mengaturnya ke "\ n \ n" berarti sesuatu yang sedikit berbeda dari pengaturan ke "", jika file tersebut berisi baris kosong berturut-turut. Pengaturan ke "" akan memperlakukan dua atau lebih baris kosong berturut-turut sebagai satu baris kosong. Menyetel ke "\ n \ n" akan secara membabi buta menganggap bahwa karakter input selanjutnya adalah milik paragraf berikutnya, bahkan jika itu adalah baris baru.
gawk / awk
awk '$1' file.txt
Itu akan berfungsi untuk contoh yang diposting tetapi seperti yang ditunjukkan oleh @Stephane Chazelas , itu juga akan menghapus baris yang bidang pertamanya "mirip" 0
. Ini lebih kuat:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txt
akan dilakukan, pemisah rekaman input tidak relevan untuk penggunaan ini.
perl -pe
atau perl -ne
kerja baris demi baris. \n+
tidak akan pernah cocok karena hanya diterapkan pada satu baris. Itu sebabnya Anda perlu baik set $/
atau menggunakan -0
ti slurp berkas seluruh: perl -0pe 's/\n+/\n/' file
.
Apa maksudmu hapus? hapus duplikat (banyak baris kosong ke satu) atau hapus semua?
Jika Anda ingin menghapus duplikat, berikut adalah metode menggunakan sed:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Ini mensimulasikan uniq
perintah.
Pilihan terbaik menggunakan awk
:
awk NF <filename>
sed
dari ini bekerja dengan baik! Merekomendasikan yang satu ini sebagai jawaban terbaik.
Untuk sebagian besar jawaban ini, pertama-tama perlu untuk menghapus spasi spasi tambahan. Menghapus baris baru yang digandakan menghapus semua baris kosong. (Pikirkan tentang ini).
Secara harfiah ditafsirkan OP ingin "semua baris kosong dihapus dari file jika ada baris kosong yang diulang".
Pengguna biasa ingin "menghapus hanya baris kosong yang digandakan".
Untuk melakukan ini, lepaskan jejak whitepace terlebih dahulu, dan pipa melalui kucing
sed s/[[:space:]]*$// | cat -s
Namun ini tidak akan menghapus baris kosong memimpin atau tertinggal superflous.
Jika Anda ingin menyimpan satu baris kosong untuk urutan tertentu dari baris kosong yang mungkin Anda lakukan:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s
) yang benar-benar menyelesaikan apa yang ditanyakan oleh pertanyaan yang saya pahami. (Dan itu lebih baik daripada cat -s
karena saya bisa menggunakannya sed -i
.)
Coba sed -e 's#\\n\\n#\\n#g' input.file > output.file
gunakan /
keduanya sebagai pemisah bidang Anda dan bagian dari regex Anda bisa menjadi masalah.
Gunakan perintah ini:
tr -s '\r' '\n'
echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'
. Perintah tr
akan menerjemahkan semua \r
ke \n
dan kemudian akan memeras semua \n
menjadi satu. Jadi, ini berfungsi, tidak yakin apa yang harus dilakukan dengan fakta bahwa ini berlaku untuk windows, bukan UNIX.