右から左へのシェルブレース拡張


9

zsh(および他のシェル)で、(たとえば)のような引数を含めた場合:

{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}非常に有用ではありません
マイケルMrozek

そうだね。並べ替え順序に基づく回答を避けるために、それを明確にすることもできます。
terdon

回答:


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 2015年

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 2015年

マイケルは特定のペアリングの順序を求めていると思います(明示的には明言されていません)。あなたのアプローチは、要素がアルファベット順にソートできる場合にのみ機能します。foobad foobaz barbad barbaz{foo、bar} {bad、baz} `から取得するのはどうですか?
terdon

@terdon-ええと、それが彼の後にあるなら、なぜそう言わないのですか?とにかく、計算を行う場合、列はどのようにでもペアにできます。
mikeserv 2015年

1
@terdon-あなたのモデレーターは、あなたが何を意味していないかを言う習慣をしているようです。
mikeserv 2015年

2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.