Entfernen von Zeilenumbrüchen aus einer RTF-Datei mit sed

3636
MoshiBin

Ich habe eine RTF-Datei, die wie folgt formatiert ist:

 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 wurde der Kürze halber hinzugefügt)

Wie Sie sehen, wurden neue Zeilen eingefügt, um sie an die Breite einer Seite anzupassen. Das Problem entsteht, wenn ich versuche, den Text auf meinem iPhone zu lesen, der eine andere Zeilenlänge hat. Die Zeilen brechen und die Lesbarkeit wird behindert.

Die ideale Lösung wäre eine, bei der die Datei für jeden Absatz in eine einzige Zeile konvertiert wird, während die neue Zeile und der Einzug für neue Absätze beibehalten werden.

Bisher habe ich versucht, die Datei mit sed zu analysieren, konnte jedoch keinen mehrzeiligen Regex erstellen. Idealerweise möchte ich alle "\ r \ n" s durch "" ersetzen, es sei denn, die nächste Zeile beginnt mit einem Leerzeichen.

Gibt es dafür eine bessere Lösung? Wenn nicht, wie kann ich das mit sed machen?

2

2 Antworten auf die Frage

3
MoshiBin

Die Lösung lag in einem Werkzeug, an das ich nicht ernsthaft nachgedacht habe - awk

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

Dies geht über die Datei mit \ par als Feldseparator und druckt ein \ par vor jeder Zeile, die mit 4 Leerzeichen beginnt (was den Anfang eines neuen Absatzes markiert), und entfernt (oder druckt nicht). Wenn es mit etwas anderem als einem Leerzeichen beginnt.

Was wir jetzt haben, ist eine Datei mit \ par, wo rechtliche Zeilenumbrüche sein sollten. Der nächste Schritt wäre, alle Zeilenumbrüche zu entfernen, um unerwünschte Zeilenumbrüche zu beseitigen:

tr -d '\r\n' 

Fügen Sie das Ergebnis dann in sed ein, um \ par durch \ par \ r \ n zu ersetzen, und fügen Sie praktisch eine neue Zeile hinzu, in der ein \ par steht.

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

Und fertig.

Das einzige wirkliche Problem, das ich mit dieser Methode gefunden habe, ist, dass der RTF-Header ruiniert wurde. Kein Problem, ich habe gerade den Header von der Originaldatei übernommen.

Ein weiteres kleineres Problem war, dass Kapiteltitel mit vorherigen Absätzen inline gedruckt wurden. Dies liegt daran, dass Kapitelüberschriften noch nicht mit einem Leerzeichen beginnen und dennoch als Absatz betrachtet werden sollten. In meinem Fall waren Kapitel wie folgt gekennzeichnet:

Kapitel zweiundzwanzig
Kapitel Name

So kümmerte sich ein schneller Sed um sie:

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

Ich habe mein Buch jetzt im richtigen Format, sodass es auch auf anderen Geräten (z. B. meinem iPod) lesbar ist.

2
Peter Boughton

Diese Regex passt zu dem, was Sie möchten:

\r\n(?! ) 


Um das mit sed zu benutzen:

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


Es scheint jedoch, dass sed keine negativen Lookaheads unterstützt, und erfordert umgekehrte Parens, sodass Sie stattdessen Folgendes verwenden können:

sed 's/\r\n\([^ ]\)/ \1/g' filename.rtf 
sed arbeitet durch das Lesen einer Zeile. \ r \ n stimmt nicht überein MoshiBin vor 14 Jahren 0
Hmm, dann benutze ein Werkzeug, das dann auf einmal die ganze Datei bearbeitet Peter Boughton vor 14 Jahren 0
Oder hier ist eine mögliche Lösung für Multi-Line mit Sed: http://www.ilfilosofo.com/blog/2008/04/26/sed-multi-line-search-and-replace/ Peter Boughton vor 14 Jahren 0