${pasteargs// /- } 参数扩展是什么意思?

${pasteargs// /- } 参数扩展是什么意思?

语境: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以 '/' 开头,所有匹配的模式都被替换为 细绳。

经说明书检查后。

  1. 做什么${pasteargs// /- }
  2. 我确实知道%s指的是printf争论。但%*s 16我不知道。
  3. 即使我引用了手册,仍然不确定paste -d\

答案1

  1. printf %*s 16意思是:打印16个空格。看这个答案以获得进一步的解释。所以现在pasteargs是一个值为16个空格的变量。

  2. ${pasteargs// /- }意思是:替换全部 变量中出现(空格) -(换句话说:在变量中的每个空格之前添加连字符)。正如您从手册中引用的:

    如果模式以“/”开头,则模式的所有匹配项都将替换为字符串。

    这里的模式是/,这意味着:全部空间的匹配。所以现在 的值pasteargs是 16 个连字符,以空格分隔。

  3. 关于该paste命令,您首先需要了解它后面有 16 个连字符,表示 16 个流。基本上它将每 16 个连续行合并为一行。默认情况下,合并这些行时,它们由以下分隔符分隔选项卡。所以paste -d\ (注意反斜杠后面的尾随空格)意味着将行分隔开 空间\) 代替选项卡

总而言之,此命令(如广告所示)只是将输入中的每 16 个连续行合并为以空格分隔的一行。

答案2

最好的办法是在沙箱(测试)环境(虚拟机?)中尝试并查看结果。您的问题不符合示例中给出的顺序,因此

  1. man printf

    场宽 ...代替十进制数字字符串...可以写“*”...以指定在下一个参数中给出字段宽度,...它必须是 int 类型。

因此,printf %*s 16如果缺少要打印的参数,则会打印 16 个空格。

  1. 该“参数扩展”将之前打印的 16 个空格转换为 16 个破折号空格序列。

  2. 往上看

  3. 这只是一个转义空格来代替默认<TAB>分隔符

相关内容