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

jia*_*ian 6 bash shell-script

上下文:https ://stackoverflow.com/a/47348104/15603477

\n
printf -v pasteargs %*s 16\npaste -d\\  ${pasteargs// /- } < <(seq 1 42)\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32\n33 34 35 36 37 38 39 40 41 42\n
Run Code Online (Sandbox Code Playgroud)\n
\n

Paste -d, --delimiters=LIST 重用 LIST 中的字符而不是\n制表符

\n
\n

${参数/模式/字符串}

\n
\n

该模式被扩展以产生与文件名扩展中一样的模式。参数被扩展,模式与其值的最长匹配被替换为字符串。匹配\n根据下面描述的规则执行(请参阅模式匹配)。如果\npattern以 \xe2\x80\x98/\xe2\x80\x99 开头,则所有匹配的pattern 都将替换为\n字符串。

\n
\n

经说明书检查后。

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

avi*_*iro 6

    \n
  1. printf %*s 16意思是:打印16个空格。请参阅此答案以获取进一步的解释。所以现在pasteargs是一个值为16个空格的变量。

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

    \n
    \n

    如果模式以 \xe2\x80\x98/\xe2\x80\x99 开头,则模式的所有匹配项都将替换为字符串。

    \n
    \n

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

    \n
  4. \n
  5. 关于该paste命令,您首先需要了解它后面跟着 16 个连字符,意味着 16 个流。基本上它将每 16 个连续行合并为一行。默认情况下,合并这些行时,它们由制表符分隔。因此paste -d\\ (注意反斜杠后面的尾随空格)意味着用 空格( \\ ) 而不是制表符分隔行分隔行。

    \n
  6. \n
\n

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

\n