6

この方法でリストを簡単に生成する方法を知っています:

echo {a,b,c,d}_{0..3}

これは次のようになります:

a_0 a_1 a_2 a_3 b_0 b_1 b_2 b_3 c_0 c_1 c_2 c_3 d_0 d_1 d_2 d_3

しかし、同じリストを生成するにはどうすればよいでしょうか。:

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3

1 行に収まる限り、末尾や文字nからの並べ替えなどのトリックは問題ありません。私もzshを使っていますが、bashで動くものなら問題ありません。

4

5 に答える 5

2

不必要に複雑で興味深い別の解決策(zshのみ)も見つけました。

print {a,b,c,d}_${^=${$+0 1 2 3}}

ここでzshは何をしていますか?最後のネストされたブレースで始まり、次のようになります。

  • $$ が存在するかどうかを確認するため、"0 1 2 3" (演算子 +) を使用します
  • 配列に分割します (演算子 =)
  • ブレース展開 (演算子 ^) のように、各要素の分散を文字列に適用します。
  • 最後に、最初のブレースの展開を適用します (パラメーター展開と比較してブレース展開の優先度が低いため)

{0..3}フラグ/オペレーターがこの種の予備拡張をトリガーできないため、自分自身を拡張する必要があることに注意してください(eval上記で説明した場合を除く)。

于 2013-08-02T13:27:16.110 に答える
2

別のハックでこの問題を解決する別のアプローチを追加したいと思います。これは、式を回して評価し、結果を元に戻すことに基づいています。

eval echo $(echo '{a,b,c,d}_{0..3}' | rev | tr '{}' '}{') | rev

結果は

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3

しかし、これを本当に提案できるかどうかはわかりません;-)

于 2013-08-02T12:28:04.323 に答える
2

厳密には bash-in-house ではありませんが、

printf "%s\n" {a,b,c,d}_{0..3} | sort -t_ -k2,2n
于 2013-08-02T13:23:26.483 に答える