我做了
a=( pacman -Qlq packagename )
将属于package
的文件放入数组
为什么此打印仅与第一次打印匹配,以及如何在zsh中打印所有内容:
print -l ${a[(r)*i*]}
此外,如何在所有数组元素上应用zsh限定符,比如列出文件
只能通过(.)
在此过程中是否有更简单的方法来跳过中间数组, 以某种方式在命令替换的结果上指定限定符?
答案 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
与您系统上的任何普通文件都不匹配。)。