将bash中逗号分隔数据包装到固定行长度

D W*_*D W 1 bash word-wrap

您好我想包装以下逗号分隔数据:

-X, run, abs, absolute, accept, accept, alarm, schedule, atan2, arctangent, bind, binds, binmode, prepare, bless, create, caller, get, chdir, change, chmod, changes, chomp, remove, chop, remove, chown, change, chr, get, chroot, make, close, close, closedir, close, connect, connect, continue, optional, cos, cosine, crypt, one-way, dbmclose, breaks, dbmopen, create, defined, test, delete, deletes, die, raise, do, turn, dump, create, each, retrieve, endgrent, be, endhostent, be, endnetent, be, endprotoent, be, endpwent, be, endservent, be, eof, test, eval, catch, exec, abandon, exists, test, exit, terminate, exp, raise, fcntl, file, fileno, return, flock, lock, fork, create, format, declare, formline, internal, getc, get, getgrent, get, getgrgid, get, getgrnam, get, gethostbyaddr, get, gethostbyname, get, gethostent, get, getlogin, return, getnetbyaddr, get, getnetbyname, get, getnetent, get, getpeername, find, getpgrp, get, getppid, get, getpriority, get, getprotobyname, get, getprotobynumber, get, getprotoent, get, getpwent, get, getpwnam, get, getpwuid, get, getservbyname, get, getservbyport, get, getservent, get, getsockname, retrieve, getsockopt, get, glob, expand, gmtime, convert, goto, create, grep, locate, hex, convert, import, patch, int, get, ioctl, system-dependent, join, join, keys, retrieve, kill, send, last, exit, lc, return, lcfirst, return, length, return, link, create, listen, register, local, create, localtime, convert, log, retrieve, lstat, stat, m//, match, map, apply, mkdir, create, msgctl, SysV, msgget, get, msgrcv, receive, msgsnd, send, my, declare, next, iterate, no, unimport, oct, convert, open, open, opendir, open, ord, find, pack, convert, package, declare, pipe, open, pop, remove, pos, find, print, output, printf, output, prototype, get, push, append, q/STRING/, singly, qq/STRING/, doubly, quotemeta, quote, qw/STRING/, quote, qx/STRING/, backquote, rand, retrieve, read, fixed-length, readdir, get, readlink, determine, recv, receive, redo, start, ref, find, rename, change, require, load, reset, clear, return, get, reverse, flip, rewinddir, reset, rindex, right-to-left, rmdir, remove, s///, replace, scalar, force, seek, reposition, seekdir, reposition, select, reset, semctl, SysV, semget, get, semop, SysV, send, send, setgrent, prepare, sethostent, prepare, setnetent, prepare, setpgrp, set, setpriority, set, setprotoent, prepare, setpwent, prepare, setservent, prepare, setsockopt, set, shift, remove, shmctl, SysV, shmget, get, shmread, read, shmwrite, write, shutdown, close, sin, return, sleep, block, socket, create, socketpair, create, sort, sort, splice, add, split, split, sprintf, formatted, sqrt, square, srand, seed, stat, get, study, optimize, sub, declare, substr, get, symlink, create, syscall, execute, sysread, fixed-length, system, run, syswrite, fixed-length, tell, get, telldir, get, tie, bind, time, return, times, return, tr///, transliterate, truncate, shorten, uc, return, ucfirst, return, umask, set, undef, remove, unlink, remove, unpack, convert, unshift, prepend, untie, break, use, load, utime, set, values, return, vec, test, wait, wait, waitpid, wait, wantarray, get, warn, print, write, print, y///, transliterate,
Run Code Online (Sandbox Code Playgroud)

这样在70字符行长度之前的最后一个逗号处添加换行符.优选地,这可以在某种bash one衬里中完成.

cec*_*rik 7

echo 'your, text, here' | fold -sw 70
Run Code Online (Sandbox Code Playgroud)

这应该给你你想要的输出.您可以从文件或其他任何地方获取它,而不是使用echo,或者您可以直接使用fold命令并将其粘贴到stdin上.

折叠中的"-w 70"告诉它在每行70个字符后换行,-s告诉它在每个逗号后换行.


int*_*ted 5

回应您关于逗号之间可能嵌入空格的情况的评论:

我认为您使用的方向是正确的sed。您可以选择的一种选择是将所有空格映射到某个未使用的字符,然后将逗号映射到空格,fold,然后恢复原始映射。但我认为这会给你留下一些奇怪的东西,比如以空格开头的线条。

因此,您似乎只想将前面没有逗号的任何空格重新映射到您知道文本中不存在的某些字符或序列,然后反转以将它们切换回来。

例如,

echo "$blahblah" | sed 's/\([^,]\) /\1\t/g' | fold -s | sed 's/\t/ /g
Run Code Online (Sandbox Code Playgroud)

如果文本中没有制表符并且不存在连续的嵌入空格,则该方法将起作用。

如果有的话,我想你需要使用一些更复杂的东西,比如

echo "$blahblah" | \
    perl -pe 's/([^, ])( +)/$1 . "_" x length($2)/ge' | \
    fold -s | \
    tr _ ' '
Run Code Online (Sandbox Code Playgroud)

使得/ge每个替换值被计算为 perl 表达式。

最后tr的 基本上相当于sed最后一个命令的结束。

这假设字符“_”不保证不会出现在源文本中。当然有更好的字符可供选择,例如未使用的控制字符,例如^V。perl如果您最后使用现代语言进行翻译,我认为您可以使用一些晦涩的多字节 unicode 字符。

这个建议相当即兴,并且存在一些明显的问题。例如,除非有空格,否则它不会在逗号后中断。这可能并不是您真正想要的。在 CPAN/PyPI/等方面进行一些挖掘可能是值得的。为了更强大的东西。或者您可以编写自己的折叠实用程序......