Bug*_*ddy 13 bash shell-script text-processing
使用常见的 bash 工具作为 shell 脚本的一部分,我想以每 N 个字符的间隔重复插入一个换行符 ('\n') 到一个长字符串中。
例如,给定这个字符串,我将如何每 20 个字符插入一个换行符?
head -n 50 /dev/urandom | tr -dc A-Za-z0-9
Run Code Online (Sandbox Code Playgroud)
我试图实现的结果示例:
ZL1WEV72TTO0S83LP2I2
MTQ8DEIU3GSSYJOI9CFE
6GEPWUPCBBHLWNA4M28D
P2DHDI1L2JQIZJL0ACFV
UDYEK7HN7HQY4E2U6VFC
RH68ZZJGMSSC5YLHO0KZ
94LMELDIN1BAXQKTNSMH
0DXLM7B5966UEFGZENLZ
4917Y741L2WRTG5ACFGQ
GRVDVT3CYOLYKNT2ZYUJ
EAVN1EY4O161VTW1P3OY
Q17T24S7S9BDG1RMKGBX
WOZSI4D35U81P68NF5SB
HH7AOYHV2TWQP27A40QC
QW5N4JDK5001EAQXF41N
FKH3Q5GOQZ54HZG2FFZS
Q89KGMQZ46YBW3GVROYH
AIBOU8NFM39RYP1XBLQM
YLG8SSIW6J6XG6UJEKXO
Run Code Online (Sandbox Code Playgroud)
一个用例是快速制作一组固定长度的随机密码或 ID。我做上面例子的方式是:
for i in {1..30}; do head /dev/random | tr -dc A-Z0-9 | head -c 20 ; echo ''; done
Run Code Online (Sandbox Code Playgroud)
但是,出于学习目的,我想以不同的方式进行。我想从一个任意长的字符串开始并插入换行符,从而将一个字符串分成多个固定字符长度的小字符串。
thr*_*rig 19
可敬的fold命令(“Bill Joy 于 1977 年 6 月 28 日编写”)可以换行:
$ printf "foobarzot\n" | fold -w 3
foo
bar
zot
Run Code Online (Sandbox Code Playgroud)
但是,有一些边缘情况
BUGS 传统的 roff(7) 输出语义,由 GNU nroff 和 mandoc(1) 实现,只使用一个退格来备份前一个字符,即使是双角字符。POSIX 所需的折叠退格语义错误地处理了这种退格编码的序列,提前断行。fmt(1) 实用程序提供了类似的功能并且不会遇到该问题,但没有被 POSIX 标准化。
所以如果你的输入有退格字符,你可能需要过滤或删除那些
$ printf "a\bc\bd\be\n" | col -b | fold -w 1
e
$ printf "a\bc\bd\be\n" | tr -d "\b" | fold -w 1
a
c
d
e
Run Code Online (Sandbox Code Playgroud)
unx*_*nut 13
我喜欢fold答案,但以防万一你想要sed,这里是:
sed 's/.\{20\}/&\
/g' filename
Run Code Online (Sandbox Code Playgroud)
您可以-i用于就地插入。