ZSH:带前缀的 glob

ZSH:带前缀的 glob

是否可以向 shell glob 扩展添加“前缀”?我的用例如下,我有一个程序需要重复选项标志来传递多个文件作为输入:

$ ls
foo.txt bar.txt baz.txt
$ ./some-script.sh -a foo.txt -a bar.txt -a baz.txt 

我希望能够使用某种扩展来添加'-a '到 的每个项目中*txt。这可能吗?用 zsh?bash?

答案1

您可以在使用所谓的glob 限定符(参见章节Glob 限定符在里面韋什麼意思手册页):

./some-script.sh *.txt(P:-a:)

对于解释,我引用了手册:

细绳字符串将作为单独的单词添加到每个 glob 匹配项的前面。字符串的分隔方式与上述 e glob 限定符的参数相同。限定符可以重复;单词将单独添加到前面,以便生成的命令行包含的单词的顺序与 glob 限定符列表中给出的顺序相同。

一个典型的用法是在所有出现的文件名前添加一个选项;例如,模式*(P:-f:)生成命令行参数-f file1 -f file2 ...

如果修饰符 ^ 处于活动状态,则字符串将被附加而不是添加到前面。添加和附加是独立完成的,因此两者都可以在同一个 glob 表达式中使用;例如,通过
编写*(P:foo:^P:bar:^P:baz:)生成命令行参数的foo baz file1 bar ...

为了谨慎起见,请先检查

$ print ./some-script.sh *.txt(P:-a:)
./some-script.sh -a foo.txt -a bar.txt -a baz.txt 

如果您获得了期望的结果。

答案2

如果我们不希望前缀和文件名之间有任何空格,或者我们还想要后缀或任何其他字符串操作,我正在为 zsh 扩展@mpy 答案:

print -l *.txt(e:'REPLY=PFX_${REPLY}_SFX':)

这使:

PFX_foo.txt_SFX
PFX_bar.txt_SFX
PFX_baz.txt_SFX

请注意,单引号很重要,以避免 $REPLY 过早扩展。

例如(即使dd只处理最后一个if=参数):

dd *.img(e:'REPLY=if=$REPLY':)

http://zsh.sourceforge.net/Doc/Release/Expansion.html#index-reply_002c-use-of

相关内容