从右到左的外壳支撑扩展

从右到左的外壳支撑扩展

在 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

fishshell 中,默认情况下你有这种行为,因为展开fish是从右到左执行的:

$ fish -c 'echo {a,b,c}{d,e,f}'
ad bd cd ae be ce af bf cf

相关内容