Mengenai apakah ini duplikat : Ada pertanyaan yang serupa dengan kata-kata seperti https://unix.stackexchange.com/questions/76061/can-sed-remove-double-newline-characters atau https://stackoverflow.com/questions/27510462 / bagaimana-bisa-saya-menghapus-double-baris-istirahat-dengan-sed - pada yang populer pertama, meskipun pertanyaan aslinya bisa dibilang adalah sama dengan saya, pertanyaan yang diterima dan paling banyak dihapus menghilangkan semua baris kosong, bukan hanya "ketika ada 2 atau lebih bersama "seperti pertanyaan yang diajukan. Beberapa komentar mengeluh bahwa jawaban itu dan yang lain berperilaku seperti itu, tetapi tidak ada jawaban yang diberikan untuk meninggalkan satu baris kosong. Beberapa jawaban lain mengubah duplikat baris kosong menjadi satu baris kosong (meremas), daripada menghapusnya seluruhnya.
Saya mencari cara skrip untuk menghapus kembali ke belakang baris kosong, tetapi meninggalkan satu baris kosong di sana.
Saya mencari untuk secara otomatis membersihkan .srt
file (subtitle). Format ini memerlukan baris baru antara bagian subtitle (apa yang ditampilkan pada waktu tertentu). Biasanya, jika ada 2 baris yang harus ditampilkan sekaligus, penulis subtitle hanya memiliki 2 baris. Ada gaya lain yang digunakan beberapa penulis untuk menempatkan 2 garis kosong di antara garis yang akan ditampilkan. Pada perangkat saya, ini memiliki efek menampilkan baris pertama saja, dan mungkin membuat baris kedua dari TV.
Jadi, saya ingin mengubah ini:
1
00:00:01,800 --> 00:00:03,802
First line is here
Second line is here
2
...
Ke dalam ini:
1
00:00:01,800 --> 00:00:03,802
First line is here
Second line is here
2
...
Bukan berarti mungkin perlu ditangani secara berbeda, tetapi format file mengharuskan ada baris kosong di bagian bawah file, yang harus dibiarkan di sana.
Saya ingin ini bekerja mungkin dengan pertama menghapus spasi spasi, kemudian hanya menghapus semua baris kosong yang menyentuh baris kosong lain. Saya tidak ingin itu berlabuh berdasarkan sisa format a .srt
, seperti yang harus dilakukan dengan berapa banyak garis antara bagian bernomor. (Saya sudah berpikir bahwa semua baris kosong dapat dihapus, dan baris baru dapat ditambahkan kembali pada baris yang hanya berisi karakter numerik, tapi saya berharap tetap lebih generik dari itu, mengabaikan .srt
format yang sebenarnya .)
Juga, jika karena alasan tertentu .srt
memiliki lebih dari 2 baris teks, saya ingin itu tetap seperti itu.
Jadi, mungkin sesuatu seperti:
cat some.srt | sed 's/[ \t]*$//' | SOMETHING_ELSE
Saya lebih suka bash
, sed
atau awk
solusi atas perl
satu. Jika saya mengerti benar, saya pikir awk
akan lebih mudah untuk mengimplementasikannya daripada sed
menjadi multi-line.
sed
skrip ini akan berfungsised -r ':a;N;${:b;s/\n[[:blank:]]+\n/\n\n/;tb;s/\n{3,}/\n/g;s/\n+$/\n/};ba'
.Jawaban:
Jika sisa baris yang berdekatan di file Anda unik, dan itu hanya baris kosong yang berdekatan yang ingin Anda hapus, Anda bisa menggunakan
uniq
:Menjalankan file contoh Anda melalui itu kembali:
PS. contoh Anda tidak melakukan apa yang diminta subjek, itu menghapus semua baris kosong antara Pertama & Kedua - tidak meninggalkan satu baris kosong.
Menariknya, menggunakan
uniq -u
(hanya mencetak baris unik) pada file contoh Anda memberikan hasil dalam output contoh Anda (menghapus dua baris kosong, tidak meninggalkan antara Pertama & Kedua):sumber
\n+
apa-apa, yang meninggalkan satu\n
di tempat. Tapi, absen seperti olution,uniq -u
mungkin harus bekerja. Kecuali jika ada 2 baris subtitle identik yang ditampilkan sekaligus seperti dua karakter yang mengatakan hal yang sama, itu seharusnya bekerja dengan cukup baik.uniq
opsi-d, --repeated
"hanya mencetak garis duplikat, satu untuk setiap grup" atau-D
"mencetak semua baris duplikat".