语境:https://stackoverflow.com/a/47348104/15603477
printf -v pasteargs %*s 16
paste -d\ ${pasteargs// /- } < <(seq 1 42)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40 41 42
Paste -d, --delimiters=LIST 重用 LIST 中的字符而不是制表符
${参数/模式/字符串}
该模式被扩展以产生一个模式,就像文件名扩展一样。参数被扩展,并且模式与其值的最长匹配被替换为字符串。匹配根据下述规则执行(请参阅模式匹配)。如果模式b以 '/' 开头,所有匹配的模式都被替换为 细绳。
经说明书检查后。
- 做什么
${pasteargs// /- }
。 - 我确实知道
%s
指的是printf
争论。但%*s 16
我不知道。 - 即使我引用了手册,仍然不确定
paste -d\
答案1
printf %*s 16
意思是:打印16个空格。看这个答案以获得进一步的解释。所以现在pasteargs
是一个值为16个空格的变量。${pasteargs// /- }
意思是:替换全部变量中出现(空格)
-
(换句话说:在变量中的每个空格之前添加连字符)。正如您从手册中引用的:如果模式以“/”开头,则模式的所有匹配项都将替换为字符串。
这里的模式是
/
,这意味着:全部空间的匹配。所以现在 的值pasteargs
是 16 个连字符,以空格分隔。关于该
paste
命令,您首先需要了解它后面有 16 个连字符,表示 16 个流。基本上它将每 16 个连续行合并为一行。默认情况下,合并这些行时,它们由以下分隔符分隔选项卡。所以paste -d\
(注意反斜杠后面的尾随空格)意味着将行分隔开 空间(\
) 代替选项卡。
总而言之,此命令(如广告所示)只是将输入中的每 16 个连续行合并为以空格分隔的一行。
答案2
最好的办法是在沙箱(测试)环境(虚拟机?)中尝试并查看结果。您的问题不符合示例中给出的顺序,因此
man printf
:场宽 ...代替十进制数字字符串...可以写“*”...以指定在下一个参数中给出字段宽度,...它必须是 int 类型。
因此,printf %*s 16
如果缺少要打印的参数,则会打印 16 个空格。
该“参数扩展”将之前打印的 16 个空格转换为 16 个破折号空格序列。
往上看
这只是一个转义空格来代替默认
<TAB>
分隔符