So ersetzt Ihr einzelne Umbrüche durch Leerzeichen, ohne dabei die Absatztrennung durch doppelte Umbrüche/Leerzeilen zu verlieren.

Texteditoren arbeiten im Terminal bisweilen mit einer festen Zeilenlänge und fügen dann am Ende der Zeilen Umbrüche ein. Wenn so ein Text nun in ein CMS, eine Textverarbeitung oder sonst wo eingefügt werden soll, stören diese Umbrüche – und müssen weg. Doppelte Umbrüche hingegen markieren in der Regel Absätze und sollten beibehalten werden. Im Terminal geht das aber ganz fix.

Vorher und Nachher

Zunächst mal sollte klar sein, was genau gemeint ist. Hier mal ein Text aus dem Editor vim mit einer Zeilenlänge von 30 Zeichen:

Ich gehe nach Hause und backe
mir dort einen Kuchen. Aber
dann will ich keinen Kuchen
mehr und brate mir stattdessen
eine Packung Spinat. Und
warum? Nur um zu zeigen, was
feste Zeilenbreiten
anrichten. 

Und hier kommt nun ein neuer
Absatz, abgetrennt durch zwei
Umbrüche - wie man das halt so
macht. 

Und dieser Text soll nun zu einem „normalen“ Fließtext werden:

Ich gehe nach Hause und backe mir dort einen Kuchen. Aber dann will ich keinen Kuchen mehr und brate mir stattdessen eine Packung Spinat. Und warum? Nur um zu zeigen, was feste Zeilenbreiten anrichten.  

Und hier kommt nun ein neuer Absatz, abgetrennt durch zwei Umbrüche - wie man das halt so macht. 

Umbrüche verarbeiten

Es müssen also in jeder Zeile die Umbrüche gegen Leerzeichen getauscht werden – außer dort, wo sie nur Absätze trennen. Ohne diese Ausnahme wäre das Ganze ein Kinderspiel: Das Tool tr würde das mit einem simplen

tr "\n" " " 

erledigen, denn tr macht nichts weiter, als ein Zeichen gegen ein anderes zu tauschen (\n steht für Umbruch/Newline).

Nebenbei: Mit sed müsste man einen Umweg gehen und zunächst die doppelten Umbrüche durch eine nicht im Text vorkommende Zeichenkette ersetzen, dann die restlichen Umbrüche entfernen und dann die Zeichenkette wieder durch Umbrüche ersetzen. Warum? Bei sed landen die Umbruchsanweisungen nicht in den Ergebnissen/Matches auf. Aber das nur am Rande …

Die Lösung ist wie so oft, wenn sed nicht so recht will das Programm awk. Für die Datei test sähe der Aufruf dann etwa so aus:

awk ' /^$/ { print "\n"; } /./ { printf("%s ", $0); } END { print ""; } ' test    

Sie nett aus, oder? Im Grunde ist es aber relativ simpel: Es gibt hier drei Befehle, die jeweils aus einem Statement mit // beziehungsweise END und einem mit {} bestehen. In den // steht die Bedingung – und wenn diese von einer Zeile erfüllt wird, wird die Anweisung in den {} ausgeführt.

/^$/ { print "\n"; } heißt: Wenn die Zeile leer ist (^ steht für den Anfang einer Zeile, $ für das Ende), dann gebe ein \n aus, also einen Umbruch.

/./ { printf("%s ", $0); } heißt: Wenn die Zeile irgendwelche Zeichen (.) enthält, dann gebe diese formatiert aus (printf). Wichtig: printf gibt Umbrüche nicht automatisch aus – die reine Ausgabe mit printf entfernt bereits alle Umbrüche! Über ("%s ", $0) wird bestimmt, was genau ausgegeben wird: $0 steht für die gesamte Zeile und das verwirrenderweise davor stehende "%s " modifiziert diese Zeile. %s kann die Anzahl der Zeichen jeder Spalte (hier also jedes Worts) beschränken – sollten also nur die ersten Buchstaben ausgedruckt werden, würde das mit %.1s funktionieren (. für beliebiges Zeichen und 1 für die Anzahl). Ohne weitere Angabe gibt "%s" alle Zeichen aller Spalten aus und "%s " ergänzt schlicht jede Zeile um ein Leerzeichen.

Anders ausgedrück: printf gibt den ganzen Text ohne Leerzeichen aus, schreibt aber hinter jede Ur-Zeile ein Leerzeichen. Es werden im Grunde also nicht wie bei tr Umbrüche gegen Leerzeichen getauscht, sondern Umbrüche schlicht ignoriert und Leerzeichen unabhängig davon vor der Ausgabe an die Zeilenenden gehängt. Super einfach, oder? ;)

END { print ""; } ist optional: Hier ist die Bedingung der Sonderfall END – nach der letzten Zeile wird schlicht noch ein Umbruch angehängt, damit die Ausgabe zum Beispiel im Terminal besser funktioniert.

awk im terminal

Mit awk lassen sich wirklich spaßige Dinge anstellen.

awk steht unter Linuxen standardmäßig zur Verfügung, unter Windows müsst Ihr es erst installieren (allerdings verhalten sich solche Tools unter Windows manchmal minimal anders – wenn also etwas nicht funktioniert …). Entweder über eine Sammlung oder als Gawk for Windows (der Befehl lautet dann gawk statt awk).

Lust auf weitere Terminal-Artikel? Zum Beispiel einen Instant Ticker bauen!

P.S.: Entschuldigt bitte das Durcheinander aus Code-Formatierung und Fett-Formatierung – das elende wordpress macht bei Fettungen immer Spirenzchen bei den Anführungszeichen.

Über den Autor

Mirco Lang

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Stichwortschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler.

Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds.

Wenn ich Dir helfen konnte und/oder Du hier mehr über Open Source, Linux, Bastelkram oder auch Windows-Basics lesen möchtest:
Spendier mir einen Kaffee via Paypal.

Kommentieren:

Wir benutzen Cookies, um die Webseite zu verbessern. Wenn Du die Seite weiter benutzt, bist Du damit einverstanden.