Dividi una riga di parole molto lunghe in righe separate di lunghezza massima


18

Ho uno script che genera un elenco di pacchetti su un'unica linea lunga separata da spazi. Le informazioni incluse in questa riga devono essere inserite in un file di testo che viene successivamente presentato a un utente.

Voglio dividere la linea lunga in più linee con una lunghezza massima definita, ad esempio 80 caratteri, ma la divisione dovrebbe avvenire solo negli spazi (quindi alcune linee potrebbero essere più brevi se non c'è spazio dopo esattamente 80 caratteri e l'elemento successivo farebbe più a lungo).

Il caso in cui una singola voce è più lunga di 80 caratteri probabilmente non accadrà mai e non mi interessa se questa voce è divisa nel mezzo o si traduce in una singola riga più lunga.

Fondamentalmente, è lo stesso che fa la maggior parte degli editor di testo quando è selezionato il wrapping automatico, ma voglio farlo da uno script di shell.

Esempio di input:

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

Esempio di output desiderato:

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

Risposte:


30

Quello che vuoi fa fold:

fold -s -w80 file
  • -s: dice folddi rompersi solo negli spazi
  • -w80: dichiarata la larghezza
  • fold: legge anche da stdin: echo "..." | fold -s -w80

1
Perfetto, grazie mille. Ero sicuro che ci doveva essere un semplice comando ma non ho mai sentito parlare di fold.
gennaio

Grazie. In qualche modo, non riesco a salvare l'output in un file quando utilizzo fold.
user1323995
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.