Разбить очень длинную строку слов на отдельные строки максимальной длины

18

У меня есть скрипт, который выводит список пакетов на одной длинной строке, разделенных пробелами. Информация, включенная в эту строку, должна быть вставлена ​​в текстовый файл, который впоследствии будет представлен пользователю.

Я хочу разбить длинную строку на несколько строк с определенной максимальной длиной, например, 80 символов, но разделение должно происходить только в пробелах (поэтому некоторые строки могут быть короче, если после 80 символов нет пробела и следующий элемент будет делать это дольше).

Случай, когда одна запись длиннее 80 символов, вероятно, никогда не произойдет, и мне все равно, будет ли эта запись разделена посередине или приведет к появлению одной более длинной строки.

По сути, это то же самое, что делает большинство текстовых редакторов, когда выбрана автоматическая упаковка, но я хочу сделать это из сценария оболочки.

Пример ввода:

libkrb5-3 libk5crypto3 openssh-server libc-bin base-files sysvinit-utils bind9-host python-minimal python-reportbug dnsutils perl libgnutls-openssl27 mutt reportbug libdns88 perl-base whois bash libgnutls26 perl-modules libapt-inst1.5 python2.7 libexpat1 libisccc80 libgssrpc4 apt-utils procmail apt locales liblwres80 libkrb5support0 python openssh-client multiarch-support libgcrypt11 dpkg libxml2 libbind9-80 wget libapt-pkg4.12 file ssh libkadm5clnt-mit8 libisccfg82 libkadm5srv-mit8 tzdata gpgv krb5-locales python2.7-minimal libgpgme11 openssl rsyslog libkdb5-6 host sysv-rc libgssapi-krb5-2 libisc84 libc6 initscripts sysvinit libmagic1 libssl1.0.0 gnupg

Требуемый пример вывода:

libkrb5-3 libk5crypto3 openssh-server libc-bin base-files sysvinit-utils
bind9-host python-minimal python-reportbug dnsutils perl libgnutls-openssl27
mutt reportbug libdns88 perl-base whois bash libgnutls26 perl-modules
libapt-inst1.5 python2.7 libexpat1 libisccc80 libgssrpc4 apt-utils procmail apt
locales liblwres80 libkrb5support0 python openssh-client multiarch-support
libgcrypt11 dpkg libxml2 libbind9-80 wget libapt-pkg4.12 file ssh
libkadm5clnt-mit8 libisccfg82 libkadm5srv-mit8 tzdata gpgv krb5-locales
python2.7-minimal libgpgme11 openssl rsyslog libkdb5-6 host sysv-rc
libgssapi-krb5-2 libisc84 libc6 initscripts sysvinit libmagic1 libssl1.0.0 gnupg
январь
источник

Ответы:

30

Что вы хотите сделать fold:

fold -s -w80 file
  • -s: говорит foldсломать только в пробелах
  • -w80: заявленная ширина
  • fold: также читает со стандартного ввода: echo "..." | fold -s -w80
хаос
источник
1
Отлично, спасибо большое. Я был уверен, что должна быть простая команда, но я никогда не слышал о фолде.
Янв
Спасибо. Почему-то мне не удается сохранить вывод в файл при использовании Fold.
user1323995