Wie schneide ich Linien ab, die länger als eine gewisse Breite sind, und markiere die abgeschnittenen Linien mit einem Auslassungszeichen?
Es sollten nur Linien markiert werden, die tatsächlich gekürzt wurden, nicht jedoch Linien, die überhaupt die richtige Länge hatten.
Ich möchte den Befehl in einer Pipeline verwenden.
text-processing
Volker Siegel
quelle
quelle
...
oder das einzelne Zeichen verwenden…
?Antworten:
Dadurch wird die Zeichenfolge abgeschnitten, weitere drei Zeichen abgeschnitten und "..." hinzugefügt, wenn die Länge länger als der Wert ist, den Sie als Parameter angeben.
quelle
Versuche dies:
Wenn NF zu hoch ist, ist der einfachere Weg:
oder eine kürzere Version:
quelle
awk
, wenn die Länge größer als maxNF
. Beispiel,mawk
hat maxNF
32767.Einige Möglichkeiten:
mit sed
etwas eleganter mit Perl (mit Lookbehind)
Wo
N
ist die Anzahl der Zeichen, nach denen Sie durch die Auslassungspunkte ersetzen möchten?quelle
man sed
weiß nicht-E
-E
steht für E xtended Regular Expression - es ist das POSIX-Äquivalent der GNUsed
-r
oder des--regex-extended
Flags. Es wird auf der Infoseite erwähnt, denke ich (info sed
dann navigiere zu Invoking sed - Befehlszeilenoptionen )awk
,sed
Undperl
wie in den anderen Antworten, präsentiert, zeichnen sich im Bereich Textverarbeitung und sind wahrscheinlich die besten Werkzeuge für den Job.Sie können dies aber auch in reiner
bash
Form tun (dh "ohne die Hülle zu verlassen"), wenn Sie möchten:Ersetzen Sie
70
durch die maximal gewünschte Länge undfilename
durch die Eingabedatei.Um dies auf der rechten Seite einer Pipe zu verwenden (dh um die Ausgabe eines anderen Befehls an diese weiterzuleiten), entfernen Sie es und setzen Sie es entweder vorher ein oder schließen Sie das Ganze ein in :
< filename
n
{ ... ;}
(Diese in Klammern eingeschlossene Version funktioniert auch in anderen Kontexten, einschließlich der Umleitung wie oben. Die Klammern sind in diesem Anwendungsfall nicht erforderlich, aber nicht schädlich.)
Das sieht so aus:
Beachten Sie, dass dies, wie bei den anderen bisher vorgestellten Lösungen, die Ausgabebreite bei Vorhandensein von Zeichen mit einer Breite von mehr als einer Spalte, z. B. horizontalen Registerkarten , nicht perfekt einschränkt .
quelle
Eine andere
perl
Lösung:quelle
Die akzeptierte Antwort, die als Funktion mit Beispiel geschrieben wurde und auch das ... in die Mitte des Strings und nicht in das Ende setzt:
Beispiel:
quelle