在 zsh (和其他 shell)中,如果我包含如下参数(例如):
{a,b,c}{d,e,f}
大括号扩展将其变为:
ad ae af bd be bf cd ce cf
就我的目的而言,参数顺序很重要,我需要大括号从右到左而不是从左到右扩展。也就是说,我希望扩展为:
ad bd cd ae be ce af bf cf
有没有办法控制多组大括号展开的顺序?我正在寻找在任何情况下都有效的东西,而不仅仅是这些论点。
答案1
您可以将参数扩展与大括号扩展结合起来。
% foo=(d e f)
$ echo {a,b,c}${^foo}
ad bd cd ae be ce af bf cf
如果您不想foo
单独定义(看起来很可能),您可以使用以下内容:
$ echo {a,b,c}${^:-d e f}
ad bd cd ae be ce af bf cf
如果您rcexpandparam
设置了该选项,则不需要^
两个示例中的 来启用此行为。
(注意:在测试时,我还设置了shwordsplit
选项。如果您没有设置它,请尝试,例如echo {a,b,c}${^=:-d e f}
。故事的寓意:在 中几乎任何事情都是可能的zsh
,但您必须确保使用正确的选项和语法的组合。)
答案2
在zsh
你可以使用-C
指定的列数喜欢的论据print
:
print $(print -C3 {a,b,c}{d,e,f})
...要得到...
ad bd cd ae be ce af bf cf
...不$IFS
分割以下内容:
print -C3 {a,b,c}{d,e,f}
...印刷...
ad bd cd
ae be ce
af bf cf
...但你可以这样做先跨越再下降喜欢...
print -aC3 {a,b,c}{d,e,f}
ad ae af
bd be bf
cd ce cf
...或者...
print $(print -aC2 {foo,bar}{bad,baz})
foobad foobaz barbad barbaz
答案3
您可以将数字放在第二组每个元素的末尾,然后对最后一个字符进行排序:
echo -e "\n"{a,b,c}{d1,e2,f3} | sort -k 1.3 | cut -c 1-2 | tr '\n' ' '
更好的是在一些分隔符(空格)后添加数字,以剪切字段,而不是字符:
echo -e "\n"{a,b,c}{"d 1","e 2","f 3"} | sort -k 2n | cut -f 1 -d ' ' -s | tr '\n' ' '
答案4
在fish
shell 中,默认情况下你有这种行为,因为展开fish
是从右到左执行的:
$ fish -c 'echo {a,b,c}{d,e,f}'
ad bd cd ae be ce af bf cf