Dividir una línea muy larga de palabras en líneas separadas de longitud máxima

18

Tengo un script que genera una lista de paquetes en una sola línea larga separada por espacios. La información incluida en esta línea se insertará en un archivo de texto que luego se presentará a un usuario.

Quiero dividir la línea larga en varias líneas con una longitud máxima definida, por ejemplo, 80 caracteres, pero la división debe ocurrir solo en espacios (por lo que algunas líneas pueden ser más cortas si no hay espacio después de exactamente 80 caracteres y el siguiente elemento haría es más largo)

El caso en el que una sola entrada tiene más de 80 caracteres probablemente nunca sucederá y no me importa si esta entrada se divide en el medio o da como resultado una sola línea más larga.

Básicamente, es lo mismo que hacen la mayoría de los editores de texto cuando se selecciona el ajuste automático, pero quiero hacerlo desde un script de shell.

Entrada de ejemplo:

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

Ejemplo de salida deseado:

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
ene
fuente

Respuestas:

30

Lo que quieres hace fold:

fold -s -w80 file
  • -s: le dice foldque se rompa solo en espacios
  • -w80: declarado el ancho
  • fold: también lee de stdin: echo "..." | fold -s -w80
caos
fuente
1
Perfecto, muchas gracias. Estaba seguro de que debe haber un comando simple, pero nunca oí hablar de fold.
enero
Gracias. De alguna manera, no puedo guardar la salida en un archivo cuando uso fold.
user1323995