将很长的单词行拆分为最大长度的单独行

将很长的单词行拆分为最大长度的单独行

我有一个脚本,它在一个由空格分隔的长行上输出软件包列表。此行中包含的信息应插入到文本文件中,该文件稍后将呈现给用户。

我想将长行拆分成多行,并定义最大长度,例如 80 个字符,但拆分应仅发生在空格处(因此,如果 80 个字符后没有空格,则某些行可能会更短,而下一个元素会使它更长)。

单个条目长度超过 80 个字符的情况可能永远不会发生,而且我也不关心这个条目是否在中间被分割或导致一行更长。

基本上,它与大多数文本编辑器在选择自动换行时执行的操作相同,但我想通过 shell 脚本来执行此操作。

输入示例:

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

所需示例输出:

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

答案1

你想要的是fold

fold -s -w80 file
  • -s: 指示fold仅在空格处中断
  • -w80:声明宽度
  • fold:还从标准输入读取:echo "..." | fold -s -w80

答案2

我更喜欢 fmt,因为 fmt 会让长单词保持完整:

echo "a a a a a a  123456789 xyz" | fmt -6
a a a
a a a
123456789
xyz

相关内容