从右到左的外壳支架扩展


9

在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

有没有一种方法可以控制大括号的扩展顺序?我正在寻找在任何情况下都可以使用的东西,而不仅仅是这些论点。


我假设您对涉及循环或排序输出的更复杂的解决方案不感兴趣,对吗?
terdon

@terdon如果没有其他办法,我想;我希望可以通过一些技巧来更改括号扩展的评估顺序,但可能没有。不过,这些论点只是一个例子,因此仅适用于某事{a,b,c}{d,e,f}并不是很有帮助
Michael Mrozek

是的,我猜了很多。您可能需要澄清一下,以避免基于排序顺序的答案。
terdon

Answers:


8

您可以将参数扩展与括号扩展结合使用。

% 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,但是您必须确保使用正确的选项。选项和语法的组合。)


1
您应该使用print -- {a,b,c}${^=:-d e f}作为主要示例,因为split+glob缺省情况下在中关闭了zsh
cuonglm

4

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

这产生了MIchael想要避免的相同输出。他想要1.1 2.1 3.1,而您给出的是1.1 1.2 1.3(如果很清楚)。
terdon

@terdon-好点。
mikeserv

我猜(虽然没有明确说明)迈克尔遵循了特定的配对顺序。仅当元素可以按字母顺序排序时,您的方法才有效。怎么样让foobad foobaz barbad barbaz来自{FOO,酒吧} {不好,巴兹}`?
terdon

@terdon-好吧,如果那是他之后的目的,那为什么不这么说呢?无论如何,如果您进行数学运算,则可以以任何方式将这些列配对。
mikeserv

1
@terdon-主持人似乎习惯于说出您的意思。
mikeserv

2

您可以将数字放在第二组的每个元素的末尾,然后对最后一个字符进行排序:

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' ' '

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.