在数组的每个元素前面添加一些文本

bde*_*ham 3 zsh

在 中zsh,通过全局扩展,我们可以使用该P标志在每个匹配项前面添加一些文本:

$ ls -1
bar
baz
foo
$ print -- *(P:--file:)
--file bar --file baz --file foo
Run Code Online (Sandbox Code Playgroud)

数组参数有类似的东西吗?如果我写

items=(foo bar baz)
Run Code Online (Sandbox Code Playgroud)

我可以使用一些标志来获得这样的行为吗?

$ print -- ${(...)items}
--file foo --file bar --file baz
Run Code Online (Sandbox Code Playgroud)

bde*_*ham 6

最佳答案取决于您需要修改后的数组的用途。

\n\n
    \n
  1. 如果您\xe2\x80\x99re 生成命令行参数(如问题中所示),并且您\xe2\x80\x99re 使用接受标志之类的工具作为 的--file=foo替代品--file foo,最惯用的方法是使用以下${^name}形式扩张:

    \n\n
    $ items=(foo "two words" baz)\n$ print -lr -- --file=${^items}\n--file=foo\n--file=two words\n--file=baz\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    I\xe2\x80\x99m 用于print -lr演示扩展生成一个包含三个元素的数组。如果您调用这样的命令,该命令将看到三个参数。

  2. \n
  3. 如果您\xe2\x80\x99正在生成命令行参数,则可以将要添加的文本(在本示例中)放入虚拟数组中,并使用扩展形式--file将其与参数数组组合起来:${name:^^arrayname}

    \n\n
    $ flag=(--file)\n$ items=(foo "two words" baz)\n$ print -lr -- ${flag:^^items}\n--file\nfoo\n--file\ntwo words\n--file\nbaz\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这是一个包含六个元素的数组。这种格式或 (1)\xe2\x80\x94 中的格式或两者\xe2\x80\x94 应该可以被任何用于传递具有关联值的标志的命令行工具所接受。

  4. \n
  5. 您可以修改 (1) 中的方法以使用空格而不是等号:

    \n\n
    $ items=(foo "two words" baz)\n$ print -lr -- --file\\ ${^items}\n--file foo\n--file two words\n--file baz\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    (请注意,您必须使用反斜杠转义空格;使用双引号"--file ${^items}"表示其他含义。)这是一个包含三个元素的数组,但每个元素中都嵌入了空格。很少(如果有的话)命令行工具会接受这种格式的标志,但它对于其他类型的文本操作可能很有用。

  6. \n
  7. 也可以采用${name/pattern/repl}扩展的形式。该模式应以#(表示它需要在每个数组元素的开头匹配)开头,但否则应为空(以便每个数组元素都匹配,并且实际上不会替换任何文本)。

    \n\n
    $ items=(foo "two words" baz)\n$ print -lr -- ${items/#/--file }\n--file foo\n--file two words\n--file baz\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这与 (3) 具有相同的注意事项,并且它\xe2\x80\x99s 也比该方法不太惯用。

  8. \n
\n\n

请注意,当数组元素包含空格时,所有这四种方法都会做正确的事情(即,它们不会突然在空格上分割字符串)。

\n