在数组元素上应用zsh限定符或直接在命令替换的结果上应用zsh限定符

时间:2016-06-23 11:24:51

标签: zsh

我做了

a=( pacman -Qlq packagename )

将属于package的文件放入数组

为什么此打印仅与第一次打印匹配,以及如何在zsh中打印所有内容:

print -l ${a[(r)*i*]}

此外,如何在所有数组元素上应用zsh限定符,比如列出文件 只能通过(.)

在此过程中是否有更简单的方法来跳过中间数组, 以某种方式在命令替换的结果上指定限定符?

1 个答案:

答案 0 :(得分:1)

作为per documentation,下标标志(r)将仅返回第一个匹配的数组元素。

为了获取所有匹配元素,您可以使用{name:#pattern} parameter expansion,这会从扩展中删除任何元素加工pattern。要删除不匹配的元素,您可以使用标记(M)或使用^取消模式(这需要启用EXTENDED_GLOB选项):

print -l ${(M)a:#*i*}
setopt extendedglob
print -l ${a:#^*i*}

您可以直接使用命令替换($(...))上的参数扩展来跳过显式创建中间数组:

print -l ${(M)$(pacman -Qlq packagename):#*i*}

似乎globbing限定符不适用于参数扩展中的模式。但您可以启用RC_EXPAND_PARAM选项来扩展 word 中的每个数组元素,而不是整个数组。因此foo${xx}bar x=(a b c) fooabar foobbar foocbar将扩展为fooa b cbar而不是setopt rcexpandparam。您可以使用${^...}全局启用它,也可以通过将其包装在print -l ${^${(M)$(pacman -Qlq packagename):#*i*}}(.N) 中进行特定扩展。这样,您可以将glob限定符添加到已过滤数组的每个元素。要仅打印作为文件路径的元素,可以使用

(.N)

这基本上采用每个路径并附加.作为glob限定符(即使没有globs也可以工作)。然后评估生成的模式作为文件名生成的一部分。 N告诉 zsh 仅匹配普通文件。 NULL_GLOB为这些模式启用/usr选项,否则如果遇到的模式不是普通文件(例如/usr(.),则命令将中止“找不到匹配”错误)一个目录,因此Worksheet.columns与您系统上的任何普通文件都不匹配。)。