Menghapus baris baru dari file RTF menggunakan sed


2

Saya memiliki file RTF yang diformat seperti:

    Lorem ipsum dolor sit amet, consectetur adipiscing elit.\par
Nullam vitae sem porttitor urna pellentesque gravida. Nulla\par
consequat purus vel est vehicula porttitor.\par
    Maecenas pharetra metus in enim sollicitudin sollicitudin.\par
Etiam et odio tellus, eget placerat enim. Aliquam sem purus,\par
gravida sed feugiat eget, consectetur quis nisl.\par

(\ par ditambahkan untuk singkatnya)

Seperti yang Anda lihat, baris baru telah dimasukkan agar sesuai dengan lebar halaman. Masalah muncul ketika saya mencoba membaca teks di iPhone saya, yang memiliki panjang garis yang berbeda. Garis putus dan keterbacaan terhambat.

Solusi ideal adalah konversi file menjadi satu baris untuk setiap paragraf, sambil menjaga baris baru dan membuat indentasi untuk paragraf baru.

Sejauh ini saya sudah mencoba mengurai file dengan sed tetapi tidak dapat membuat regex multiline. Idealnya, saya ingin mengganti semua "\ r \ n" dengan "", kecuali kalau baris berikutnya dimulai dengan spasi.

Apakah ada solusi yang lebih baik untuk ini? Jika tidak, bagaimana saya bisa menggunakan sed?

Jawaban:


3

Solusinya terletak pada alat saya belum memikirkan serius - awk

awk 'BEGIN { FS="\\\\par" } ; /^    / {print "\\par" $1} /^[^ ]/ {print " " $1}'

Ini akan membahas file, dengan \par sebagai pemisah bidang, dan akan mencetak \ par sebelum baris apa pun yang dimulai dengan 4 spasi (yang menandai awal paragraf baru), dan menghapus (atau tidak akan mencetak) ketika dimulai dengan sesuatu selain spasi.

Sekarang yang kita miliki adalah file dengan \ par hanya di mana jeda baris hukum seharusnya. Langkah selanjutnya adalah menghapus semua baris baru sekaligus, untuk menghilangkan jeda baris nakal:

tr -d '\r\n'

Dan kemudian beri makan hasilnya sed untuk menggantikan \par dengan \ par \ r \ n , praktis menambahkan baris baru di mana a \ par berada.

sed 's/\\par/\\par\r\n/g'

Dan selesai.

Satu-satunya masalah nyata yang saya temukan dengan metode ini adalah bahwa itu merusak header RTF. Tidak masalah, saya hanya menyalin di atas tajuk dari file asli.

Masalah lain yang lebih kecil adalah bahwa judul bab sedang dicetak sesuai dengan paragraf sebelumnya. Ini karena judul bab tidak dimulai dengan spasi tetapi harus dianggap paragraf. Dalam kasus saya, bab ditandai seperti ini:

BAB TIGA PULUH DUA
Nama Bab

Jadi sed sederetan merawat mereka:

sed 's/\s*\(CHAPTER [[:upper:]-]* \)\(.*\\par\)/\\par\r\n\\par\r\n\\par\r\n\1\\par\r\n\2\\par\r\n/'

Saya sekarang memiliki buku saya dalam format yang tepat, yang membuatnya dapat dibaca di perangkat lain (seperti iPod saya).


2

Regex ini akan cocok dengan yang Anda inginkan:

\r\n(?! )


Jadi untuk menggunakannya dengan sed:

sed 's/\r\n(?! )/ /g' filename.rtf


Kecuali, tampaknya itu sed tidak mendukung lookahead negatif , dan membutuhkan backslash orang tua, jadi Anda bisa menggunakan:

sed 's/\r\n\([^ ]\)/ \1/g' filename.rtf

sed bekerja dengan membaca satu baris sekaligus. \ r \ n tidak cocok
MoshiBin

Hmm, lalu gunakan alat yang berfungsi pada seluruh file sekaligus
Peter Boughton

Atau inilah solusi yang memungkinkan untuk melakukan multi-line dengan sed: ilfilosofo.com/blog/2008/04/26/…
Peter Boughton
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.