$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
Das heißt, ich möchte, dass es \n
nach 72 Zeichen hinzugefügt wird und fortfährt. Daher müssen Sie zunächst möglicherweise alle einzelnen Zeichen entfernen \n
und sie hinzufügen. Es mag einfacher sein, mit anderen Werkzeugen einfacher zu sein, aber versuchen wir es mit awk.
[Aktualisieren]
Williamson gab die richtige Antwort, aber es brauchte etwas Hilfe, um sie zu lesen. Ich teile das Problem mit einfacheren Beispielen in Teile auf.
Warum sollte der unten stehende Code
\t
in beiden Fällengsub
die Dinge ersetzen? x ist eine Dummy-Datei, einige ungerade 0 am Ende.Wenn man die Linie
line = $0 \n more = getline \n gsub("\t"," ")
in Williamsons Antwort angreift , wird esline
anscheinend ganz normal, währendmore
der Wert von geknallt wird$0
, oder?
Code zu Teil 1
$ gawk '{ hallo="tjena\t tjena2"; gsub("\t"," "); }; END {print hallo; gsub("\t", ""); hallo=hallo gsub("\t",""); print hallo }' x
tjena tjena2
tjena tjena20
quelle
Awk nicht benutzen
Ich verstehe, dass dies nur ein Teil eines größeren Problems ist, das Sie lösen
awk
möchten, oder einfach ein Versuch, awk besser zu verstehen, aber wenn Sie wirklich nur Ihre Zeilenlänge auf 72 Spalten halten möchten, gibt es ein viel besseres Werkzeug.Das
fmt
Tool wurde speziell für diese Zwecke entwickelt:fmt
Ich werde mich auch bemühen, die Zeilen an vernünftigen Stellen zu brechen, um die Ausgabe besser lesbar zu machen. Auf derinfo
Seite finden Sie weitere Informationen zufmt
"angemessenen Orten".quelle
width
dh Bytes, keine Zeichen.fold -s -w 72
fold
funktioniert auch auf GNU-Systemen (wird mit GNU geliefertcoreutils
).Awk ist eine Turing-vollständige Sprache und keine besonders verschleierte Sprache, daher ist es einfach genug, Zeilen abzuschneiden. Hier ist eine einfache imperative Version.
Wenn Sie Zeilen zwischen Wörtern abschneiden möchten, können Sie sie in awk codieren. Das Erkennen von Wörtern ist jedoch nicht trivial (aus Gründen, die mehr mit natürlichen Sprachen als mit algorithmischen Schwierigkeiten zu tun haben). Viele Systeme haben ein Dienstprogramm namens
fmt
, das genau das tut.quelle
Hier ist eine Awk-Funktion, die Leerzeichen aufbricht:
Überraschenderweise ist dies performanter als Fold oder Fmt .
Quelle
quelle
Sie haben gefragt, warum der
awk
Code Tabulatoren ausgegeben hat und woher die Null stammt.Der Code ändert die
hello
Zeichenfolge bei dengsub()
Aufrufen nicht. Mit zwei Argumentengsub()
wirkt auf$0
.hallo
Verwenden Sie, um die Variable tatsächlich zu änderngsub(..., ..., hallo)
.Sie erhalten die Null am Ende der Zeichenfolge, da
gsub()
die Anzahl der vorgenommenen Ersetzungen zurückgegeben wird, und an einem Punkt hängen Sie diese Zahl an den Wert von anhallo
.Mir sind mindestens drei Dienstprogramme bekannt, die speziell zum Umbrechen und Formatieren von Textabschnitten vorgesehen sind:
fold
, "Filter zum Falten von Linien", ein Standard-POSIX-Dienstprogramm . Es werden einfach Zeilenumbrüche eingefügt und kein Text neu geflossen.fmt
, "einfacher Textformatierer", der häufig auch standardmäßig auf Unix-Systemen installiert wird und ein bisschen schlauer ist alsfold
beim erneuten Abfließen von Absätzen.par
, " Filter zum Neuformatieren von Absätzen ", der zusätzliche Funktionen zum Erkennen von Absatzpräfixen und -suffixen bietet (z. B. einen Text mit einem ASCII-Feld oder Kommentare in einem Teil des Quellcodes) und Einrückungen und hängende Einrückungen ein gutes Stück besser verarbeitet alsfmt
.quelle
Wenn Sie gensub verwenden, um
fold
Semantik zu erhalten , können Sie etwas in der Art von ausführenquelle