Podziel bardzo długą linię słów na osobne linie o maksymalnej długości


18

Mam skrypt, który wyświetla listę pakietów w jednym długim wierszu oddzielonym spacjami. Informacje zawarte w tym wierszu należy wstawić do pliku tekstowego, który później zostanie przedstawiony użytkownikowi.

Chcę podzielić długą linię na wiele linii o określonej maksymalnej długości, np. 80 znaków, ale podział powinien nastąpić tylko w spacjach (więc niektóre linie mogą być krótsze, jeśli po dokładnie 80 znakach nie ma spacji, a następny element utworzyłby to dłużej).

Przypadek, w którym pojedynczy wpis jest dłuższy niż 80 znaków, prawdopodobnie nigdy się nie wydarzy i nie obchodzi mnie, czy ten wpis zostanie podzielony na środku, czy spowoduje powstanie pojedynczej dłuższej linii.

Zasadniczo jest to to samo, co robi większość edytorów tekstu po wybraniu automatycznego zawijania, ale chcę to zrobić ze skryptu powłoki.

Przykładowe dane wejściowe:

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

Pożądany przykładowy wynik:

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

Odpowiedzi:


30

Co chcesz fold:

fold -s -w80 file
  • -s: każe foldłamać tylko w spacjach
  • -w80: zadeklarowano szerokość
  • fold: czyta również ze standardowego wejścia: echo "..." | fold -s -w80

1
Idealnie, wielkie dzięki. Byłem pewien, że musi istnieć proste polecenie, ale nigdy nie słyszałem o spasowaniu.
sty

Dziękuję Ci. Jakoś nie udało mi się zapisać danych wyjściowych do pliku podczas korzystania z fold.
user1323995
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.