Tutonaut

Anleitung: Zeilenlänge von Texten kürzen

text trimmint

So bringt Ihr Fließtexte auf eine fixe Zeilenlänge ohne trailing spaces – ganz fix mit fold und sed im Terminal. Ist lustiger, als es klingt ;)

Kürzlich haben wir Euch gezeigt, wie sich Texte mit fixer Zeilenlänge von den Umbrüchen befreien und in normalen Fließtext verwandeln lassen. Hier geht es um das Gegenstück: Ein „normaler“ Fließtext soll auf eine fixe Zeilenlänge gebracht werden – ohne dabei Leerzeichen an den Zeilenenden zu haben (trailing spaces). Im Terminal ist das relativ simpel.

Texte trimmen

Die Tools, die hier zum Einsatz kommen, sind eher unter Linux zu Hause, aber Ihr könnt vieles per GNU Utilities for Win unter Windows nachrüsten, was wir hier erklären. Außerdem gibt es Werkzeuge wie sed auch fast immer separat für Windows.

Zunächst mal der Vorher-Text:

cat test | nl
1   Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

Ausgegeben wir die Datei test und damit die Zeilen numeriert werden, wir diese Ausgabe noch an nl weitergereicht – achtet auf die 1 am Anfang. Es handelt sich also um eine einzige Zeile. Vermutlich seht Ihr im Browser auch tatsächlich nur eine Zeile – es ist aber nicht auszuschließen, dass der Text durch was auch immer künstlich umgebrochen wird, aber es bleibt ein einzelne Zeile.

Wir hätten aber gerne Zeilen mit maximal 60 Zeichen Länge:

fold -s --width=60 test | nl
 1  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, 
 2  sed diam nonumy eirmod tempor invidunt ut labore et dolore 
 3  magna aliquyam erat, sed diam voluptua. At vero eos et 
 4  accusam et justo duo dolores et ea rebum. Stet clita kasd 
 5  gubergren, no sea takimata sanctus est Lorem ipsum dolor 
 6  sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing 
 7  elitr, sed diam nonumy eirmod tempor invidunt ut labore et 
 8  dolore magna aliquyam erat, sed diam voluptua. At vero eosLEER
 9  et accusam et justo duo dolores et ea rebum. Stet clitaLEER
10  kasd gubergren, no sea takimata sanctus est Lorem ipsumLEER
11  dolor sit amet.

Der Text wird mit dem Befehl fold gefaltet – und zwar nur nach Leerzeichen per -s und mit einer Breite von 60 Zeichen. Sieht gut aus, aber: Es wird eben nach Leerzeichen umgebrochen, alternativ würde fold einfach strikt nach 60 Zeichen mitten im Wort abschneiden. Und so steht am Zeilenende jeweils ein Leerzeichen. In den letzten drei Zeilen manuell durch die Zeichenfolge LEER verdeutlicht – und auch nochmal unten im Bild. Und das ist unter Umständen problematisch, beispielsweise beim Skripten oder genrell in CLI-Werkzeugen.

text trimmint
Hier seht Ihr das böse Leerzeichen am Zeilenende markiert.

Also müssen die Leerzeichen entfernt werden:

fold -s --width=60 test | sed  's/[[:space:]]*$//' | nl
 1  Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
 2  sed diam nonumy eirmod tempor invidunt ut labore et dolore
 3  magna aliquyam erat, sed diam voluptua. At vero eos et
 4  accusam et justo duo dolores et ea rebum. Stet clita kasd
 5  gubergren, no sea takimata sanctus est Lorem ipsum dolor
 6  sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing
 7  elitr, sed diam nonumy eirmod tempor invidunt ut labore et
 8  dolore magna aliquyam erat, sed diam voluptua. At vero eos
 9  et accusam et justo duo dolores et ea rebum. Stet clita
10  kasd gubergren, no sea takimata sanctus est Lorem ipsum
11  dolor sit amet.

Zugegeben, sed ist nicht wirklich trivial, aber zumindest dieser Befehl sollte zu verstehen sein: Über s wird gesucht, was zwischen den folgenden beiden // steht und dann durch das ersetzt (s für substitute), was in den nächsten beiden // steht. Hier wird also nach einer beliebigen Anzahl (*) von Leerzeichen ([[:space:]]) am Zeilenende ($) gesucht, eben die trailing spaces. Und ersetzt werden sie durch nichts, also gelöscht.

Im oben erwähnten umgekehrten Fall müssen also Umbrüche wieder durch Leerzeichen ersetzt werden. Im Grunde trivial, wären da nicht die bösen doppelten Umbrüche, die Absätzt trennen … Aber lest selbst ;)

Wir haben noch viele weitere Artikel zu Terminal-Themen, als besonderen Tipp: Die Rosenmontagskuh für Linuxer. Alaaf!

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