AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 505188
Accepted
bdesham
bdesham
Asked: 2019-03-09 10:23:01 +0800 CST2019-03-09 10:23:01 +0800 CST 2019-03-09 10:23:01 +0800 CST

为数组的每个元素添加一些文本

  • 772

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

$ ls -1
bar
baz
foo
$ print -- *(P:--file:)
--file bar --file baz --file foo

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

items=(foo bar baz)

是否有一些标志可以用来获得这样的行为?

$ print -- ${(...)items}
--file foo --file bar --file baz
zsh
  • 3 3 个回答
  • 723 Views

3 个回答

  • Voted
  1. Best Answer
    bdesham
    2019-03-09T10:23:01+08:002019-03-09T10:23:01+08:00

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

    1. 如果您正在生成命令行参数(如问题中所示),并且您正在使用一个接受标志的工具--file=foo作为替代--file foo,最惯用的方法是使用${^name}扩展形式:

      $ items=(foo "two words" baz)
      $ print -lr -- --file=${^items}
      --file=foo
      --file=two words
      --file=baz
      

      我print -lr用来证明扩展会产生一个包含三个元素的数组。如果您调用这样的命令,该命令将看到三个参数。

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

      $ flag=(--file)
      $ items=(foo "two words" baz)
      $ print -lr -- ${flag:^^items}
      --file
      foo
      --file
      two words
      --file
      baz
      

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

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

      $ items=(foo "two words" baz)
      $ print -lr -- --file\ ${^items}
      --file foo
      --file two words
      --file baz
      

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

    4. 你也可以使用${name/pattern/repl}扩展的形式。模式应该以#(表示它需要在每个数组元素的开头匹配)开始,但它应该是空的(这样每个数组元素都会匹配,因此实际上不会替换任何文本)。

      $ items=(foo "two words" baz)
      $ print -lr -- ${items/#/--file }
      --file foo
      --file two words
      --file baz
      

      这与 (3) 有相同的注意事项,而且它也没有这种方法那么惯用。

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

    • 6
  2. Gilles 'SO- stop being evil'
    2019-03-14T16:59:45+08:002019-03-14T16:59:45+08:00

    您可以使用Pglob 修饰符!如果你坚持,一切都可以是一个球。请注意,我并不是说我真的想这样做。我想不出最好的方法。但这在技术上是可行的。

    % items=(foo bar baz)
    % print -lr -- /(P:--file:e\''reply=($items[@])'\')
    --file
    bar
    --file
    baz
    --file
    foo
    

    它的工作原理是创建一个与一个文件名完全匹配的 glob(/会很好),使用 glob 限定符e将一个匹配项替换为任意列表,并将P限定符应用于结果。

    这仅适用于执行 globbing 的上下文,但这通常是允许使用数组的情况。

    • 2
  3. terdon
    2019-03-09T10:34:30+08:002019-03-09T10:34:30+08:00

    您可以通过以下方式可移植地执行此操作(或至少可移植到支持此数组语法的 shell)printf:

    $ items=(foo bar baz)
    $ printf -- "--file %s " "${items[@]}"
    --file foo --file bar --file baz $ 
    

    然而,与该print命令不同的是,它不会添加尾随换行符(这就是为什么您在$上面的输出中具有与输出相同的行的原因)。如果这是一个交易破坏者,你可以这样做:

    $ printf -- "--file %s " "${items[@]}"; echo ""
    --file foo --file bar --file baz 
    
    • 1

相关问题

  • 列出没有其他后缀文件的文件

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve