Divida linhas muito longas de palavras em linhas separadas de comprimento máximo

18

Eu tenho um script que gera uma lista de pacotes em uma única linha longa separada por espaços. As informações incluídas nesta linha devem ser inseridas em um arquivo de texto que é posteriormente apresentado ao usuário.

Desejo dividir a linha longa em várias linhas com um comprimento máximo definido, por exemplo, 80 caracteres, mas a divisão deve ocorrer apenas em espaços (algumas linhas podem ser mais curtas se não houver espaço após exatamente 80 caracteres e o próximo elemento criará por mais tempo).

O caso em que uma única entrada tem mais de 80 caracteres provavelmente nunca acontecerá e eu não me importo se essa entrada estiver dividida no meio ou resultar em uma única linha mais longa.

Basicamente, é o mesmo que a maioria dos editores de texto faz quando o agrupamento automático é selecionado, mas eu quero fazer isso a partir de um script de shell.

Exemplo de entrada:

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

Exemplo de saída desejada:

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
jan
fonte

Respostas:

30

O que você quer faz fold:

fold -s -w80 file
  • -s: diz foldpara quebrar apenas em espaços
  • -w80: declarou a largura
  • fold: também lê de stdin: echo "..." | fold -s -w80
caos
fonte
1
Perfeito, muito obrigado. Eu tinha certeza de que deveria haver um comando simples, mas nunca ouvi falar de fold.
janeiro
Obrigado. De alguma forma, não consigo salvar a saída em um arquivo ao usar o fold.
user1323995 14/01