Jika sebuah baris kosong menyentuh yang lain, lepaskan, atau tinggalkan

0

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 .srtfile (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 .srtformat yang sebenarnya .)

Juga, jika karena alasan tertentu .srtmemiliki 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, sedatau awksolusi atas perlsatu. Jika saya mengerti benar, saya pikir awkakan lebih mudah untuk mengimplementasikannya daripada sedmenjadi multi-line.

pengguna1902689
sumber
Jika saya mengerti benar, sedskrip ini akan berfungsi sed -r ':a;N;${:b;s/\n[[:blank:]]+\n/\n\n/;tb;s/\n{3,}/\n/g;s/\n+$/\n/};ba'.
Paulo

Jawaban:

0

Jika sisa baris yang berdekatan di file Anda unik, dan itu hanya baris kosong yang berdekatan yang ingin Anda hapus, Anda bisa menggunakan uniq:

uniq - laporkan atau hapus baris yang berulang

Saring baris pencocokan yang berdekatan dari INPUT (atau input standar), penulisan ke OUTPUT (atau output standar).

Tanpa opsi, garis yang cocok digabungkan ke kemunculan pertama.

Menjalankan file contoh Anda melalui itu kembali:

$ uniq testfile
1
00:00:01,800 --> 00:00:03,802
    First line is here

    Second line is here

2
...

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):

$ uniq -u testfile
1
00:00:01,800 --> 00:00:03,802
    First line is here
    Second line is here

2
...
Xen2050
sumber
Anda benar tentang judul saya. Melihatnya lagi, saya tahu apa yang saya maksud dengan judul saya, tetapi ini sangat ambigu. Dengan "Hapus beberapa baris kosong kembali ke belakang, tinggalkan satu baris kosong", maksud saya: "untuk beberapa baris kosong kembali ke belakang, hapus semuanya; untuk satu baris kosong tidak kembali ke belakang dengan yang lain, biarkan saja." Saya akan mengedit judulnya.
user1902689
Saya berharap untuk solusi yang menggantikan apa yang bisa dijelaskan dalam regex multiline sebagai pengganti \n+apa-apa, yang meninggalkan satu \ndi tempat. Tapi, absen seperti olution, uniq -umungkin 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.
user1902689
Itu selalu baik ketika program coreutils hampir akan menyelesaikan masalah sendiri, tanpa perlu regex atau skrip. Anda dapat memeriksa file untuk baris duplikat terlebih dahulu, mencari apa pun yang tidak kosong, dengan uniqopsi -d, --repeated"hanya mencetak garis duplikat, satu untuk setiap grup" atau -D"mencetak semua baris duplikat".
Xen2050