Gibt es ein Befehlszeilenprogramm zum Einfügen von Zeilenumbrüchen in eine lange Zeichenfolge?

18

Gibt es ein Befehlszeilenprogramm in * nix, das bei einer langen Zeichenfolge, die mit begrenzter Textbreite angezeigt werden muss, die einzeilige Zeichenfolge in eine mehrzeilige Zeichenfolge umwandelt, wobei jede Zeile nicht länger als eine bestimmte Textbreite ist?

Zum Beispiel mit der folgenden Zeichenfolge

$ MYSTRING="Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world."

Ich würde gerne so etwas formatieren:

$ echo $MYSTRING | special-format-command --width=30
Call me Ishmael. Some years ag
o - never mind how long precis
ely - having little or no mone
y in my purse, and nothing par
ticular to interest me on shor
e, I thought I would sail abou
t a little and see the watery 
part of the world.
Cory Klein
quelle

Antworten:

24

Sie könnten den foldBefehl versuchen :

echo "$MYSTRING" | fold -w 30
Christopher
quelle
2
+1, aber vielleicht besser geschrieben als echo $MYSTRING | fold -w 30, da die -30Syntax nicht in der Fold-Manpage erscheint ?
ire_and_curses
5
Für die Nachwelt gibt es auch fmt. Der Unterschied zwischen foldund fmtbesteht darin, dass foldder Zeilenumbruch auf die festgelegte Breite angewendet wird, Wörter sogar geteilt werden und Zeilen mit Leerzeichen beginnen können. Während fmtder Zeilenumbruch in der Nähe oder unterhalb der Breite erfolgt, werden keine Wörter geteilt, die Zeilen beginnen nicht mit Leerzeichen und es können kurze Zeilen verbunden werden.
Bahamat
5
foldscheint ein ähnliches Verhalten zu haben wie bei fmtVerwendung der -sOption.
Cory Klein
lustig, ich habe -w Option verwendet, aber es aufgeteilt von char.
Amphibient
6

Hier ist eine Methode mit sed:

sed 's/.\{30\}/&\
/g'
Chris Down
quelle
Aber was bedeutet es?
Richard
1
@Richard Ersetzen Sie 30 Zeichen mit Ausnahme von newline ( .\{30\}) durch dieselbe Zeichenfolge ( &), gefolgt von einer neuen Zeile.
Chris Down
6

Der gesamte Zweck von fmt(ein Teil von GNU coreutils und andere IIRC-Versionen waren in Nicht-GNU * -Nixen enthalten, so dass fast sicher ist, dass sie bereits installiert sind) besteht darin, Absätze neu zu formatieren.

Es gibt jedoch ein noch besseres Tool par(für Absatzreformatierer). Es kann alles, was es fmtkann, aber mit viel mehr Optionen, um das genaue Ausgabeformat zu steuern.

Eines der vielen wirklich schönen Dinge parist, dass es sehr klug ist, Zitate in E-Mails zu behandeln (sogar in mehreren Ebenen) - sehr nützlich ... Ich habe meine .vimrc so eingerichtet, dass das Drücken von F5 den aktuellen Absatz durch Par sendet.

Wenn es nicht für Ihre Distribution gepackt ist (es ist für Debian und Derivate, wahrscheinlich auch für andere), finden Sie par unter http://www.nicemice.net/par/

cas
quelle
Meinen Sie mit "Nicht-GNU * -Nixen" die "echten" (nicht "Unix-ähnlichen") Unixe? (Ansonsten cooles Tool, wie es scheint.)
Emanuel Berg
Ich meine jetzt veraltete proprietäre Junk * Nixe.
cas
Das habe ich mir gedacht, aber warum benutzt du dann das Sternchen? Ich dachte, das würde umgehen, wenn ich ständig "Unix-like" tippen müsste (für Linux usw.). (Ich nerve Sie nicht wegen eines Details - oder auch nicht -, aber ich möchte wirklich wissen, dass ich Sie nicht deswegen nerve.)
Emanuel Berg
*nixist nur eine Art zu sagen "generisches Unix oder Unix-ähnliche Systeme" - es stammt aus einer Zeit, als das Wort Unix eine geschützte Marke von AT & T war
cas
3

fold -s ist die kürzeste und beste Antwort auf Ihre Frage.

In einigen Fällen ist dies jedoch so gut, wie es diese Einzweckwerkzeuge sind. In der Regel sollte dies Ihr Editor tun.

In Emacs können Sie dies nach Belieben anpassen. Was mich betrifft, verwende ich visual-line-mode(wird Wrapin der Moduszeile als untergeordneter Modus angezeigt), weil ich im Allgemeinen keine Zeilenumbrüche an einer anderen Stelle als am Ende von Absätzen haben möchte.

Ich dachte, ich würde sagen, wie ich es mache. Es ist nicht "der" Weg, aber es ist ein Weg; Wie ich die Funktionen und Variablen erwähne, besteht Ihr Weg darin, sie zusammenzusetzen und zu automatisieren, damit sie für Sie funktionieren. (Dies ist Emacs, aber für jeden ausreichend fortgeschrittenen Editor könnte ein ähnlicher Beitrag geschrieben werden.)

Ich sagte, ich habe die Zeilen visuell umbrochen, wenn ich tippe, und sie niemals manuell umbrechen. Wie immer gibt es Ausnahmen: GNUS sendet beispielsweise keine Posts an das Usenet, deren Zeilen eine bestimmte Breite (in Zeichen) überschreiten. Also benutze ich dann M-q. Führt in Emacs M-qden Befehl aus fill-paragraph. Die Variable fill-columnsteuert die Breite zum Befüllen. Als Beispiel, wenn ich dies schreibe (in einer einzigen Zeile)

This is a lot of text being written right now. The purpose is to overflow the line so I have have to line break it with M-q.

und dann benutze ich Mq

This is a lot of text being written right now. The purpose is to
overflow the line so I have have to line break it with M-q.

Mit justify-current-line(doppelt so viele Zeilen) erhalten Sie

This  is a lot  of text  being written  right now.  The purpose  is to
overflow  the  line  so  I  have  have to  line  break  it  with  M-q.

Aber ich habe festgestellt, dass die Leute selten Monospace-Schriften zum Anzeigen von Dingen verwenden, daher ergab die Verwendung keinen großen Sinn (abgesehen von meinem eigenen Sehvergnügen). Wenn es Ihnen gefällt, können Sie es optimieren fill-paragraph, um es gleichzeitig auszufüllen und zu rechtfertigen. Sie könnten auch haben Emacs dies für Sie tun, immer, wie Sie schreiben: auto-fill-mode. (Ich fand das stressig, aber das bin ich.)

Dies mag wie eine Menge Arbeit erscheinen, und das ist es auch; Aber wenn Sie fertig sind (mit diesem und 1000 anderen Dingen), können Sie es wirklich genießen, mit den Werkzeugen zu arbeiten, die sich genau so verhalten, wie Sie es möchten.

Emanuel Berg
quelle