awk
, sed
Und perl
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:
n=70
while read -r; do
if ((${#REPLY}<=n))
then printf '%s\n' "$REPLY"
else printf '%s...\n' "${REPLY:0:$((n-3))}"
fi
done < filename
Ersetzen Sie 70
durch die maximal gewünschte Länge und filename
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
{ ... ;}
{ n=70
while read -r; do
if ((${#REPLY}<=n))
then printf '%s\n' "$REPLY"
else printf '%s...\n' "${REPLY:0:$((n-3))}"
fi
done ;}
(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:
ek@Ilex:~$ help read | head -5 | { n=70
> while read -r; do
> if ((${#REPLY}<=n))
> then printf '%s\n' "$REPLY"
> else printf '%s...\n' "${REPLY:0:$((n-3))}"
> fi
> done ;}
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N n...
Read a line from the standard input and split it into fields.
Reads a single line from the standard input, or from file descr...
if the -u option is supplied. The line is split into fields as...
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 .
...
oder das einzelne Zeichen verwenden…
?