Fractionner une très longue ligne de mots en lignes distinctes de longueur maximale


18

J'ai un script qui génère une liste de packages sur une seule longue ligne séparée par des espaces. Les informations contenues dans cette ligne doivent être insérées dans un fichier texte qui sera ensuite présenté à un utilisateur.

Je veux diviser la longue ligne en plusieurs lignes avec une longueur maximale définie, par exemple 80 caractères, mais la division ne devrait se produire que dans les espaces (certaines lignes peuvent donc être plus courtes s'il n'y a pas d'espace après exactement 80 caractères et l'élément suivant ferait plus longtemps).

Le cas où une seule entrée est supérieure à 80 caractères ne se produira probablement jamais et je ne me soucie pas si cette entrée est divisée au milieu ou entraîne une seule ligne plus longue.

Fondamentalement, c'est la même chose que la plupart des éditeurs de texte lorsque l'habillage automatique est sélectionné, mais je veux le faire à partir d'un script shell.

Exemple d'entrée:

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

Exemple de sortie souhaité:

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

Réponses:


30

Ce que vous voulez fold:

fold -s -w80 file
  • -s: indique foldde ne casser que dans les espaces
  • -w80: a déclaré la largeur
  • fold: lit également depuis stdin: echo "..." | fold -s -w80

1
Parfait, merci beaucoup. J'étais sûr qu'il devait y avoir une commande simple mais je n'ai jamais entendu parler de fold.
jan

Je vous remercie. D'une manière ou d'une autre, je n'arrive pas à enregistrer la sortie dans un fichier lors de l'utilisation de fold.
user1323995
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.