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?

MoshiBin
sumber

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

MoshiBin
sumber
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
Peter Boughton
sumber
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