bashブレース展開を使用してコンマ区切りの文字列を出力する方法


17

私は...したい

$ echo a{b,c,d}

次のようなコンマ区切りリストを出力するには

ab,ac,ad

通常の出力の代わりに

ab ac ad

コマンドラインでこれを行う最も簡単な方法は何ですか?

回答:


9

要素にスペースが含まれていないと仮定すると、スペースをコンマに変換できます。

echo a{b,c,d} | tr ' ' ,

生成するもの:

ab,ac,ad

文字を含む範囲を使用することもできます。

echo a{b..d} | tr ' ' ,

これは、より広い範囲が必要な場合に特に便利です。


13

bashは生成された単語を結合するために$ IFSを使用しないようです。別の手法は、生成された単語を配列に保存し、その後$ IFS 使用することです。

サブシェルを使用するので、このシェルのIFSを変更しません。次のいずれかを選択します

( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )

これにより、コンマ区切りの文字列が標準出力に出力されます。キャプチャする場合:

joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )

生成された単語はまったく結合しませ。それが全体のポイントです、それは別々の単語に拡張します。
ステファンシャゼラス


2

示したように要素を展開し、それらをループして、最初の反復を除くすべてにカンマを追加します。

for i in a{b,c,d}; do
  u="${u:+$u, }$i"
done
echo "$u"

結果:

ab, ac, ad

bashパラメーターの置換を参照してください。


1

これがbash専用のソリューションです。

(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad

セミコロンの前の部分ab ac adは変数に割り当てられ、IN2番目の部分は検索と置換を使用してすべてのスペースをコンマに変更します。これ//は、最初の一致だけでなく、すべての一致を意味します。

名前空間を汚染しないように、すべてをサブシェル(括弧で囲む)で行います。


1

多くのコンテキストでは、このようなリストでは末尾のコンマを使用できることに注意してください。 IF末尾のカンマが許容される、置換を処理するための最も簡単な方法ですprintf

some-command "$(printf %s, a{b,c,d} )"

some-commandカンマ区切りのリストで実行されるコマンドがあり、末尾のコンマは気にしません。)

実際には、末尾のコンマを持ってはいけない場合でも使用できますprintf。必要な引数の数を指定するだけで、非常に長いリストでは扱いにくくなります。

some-command "$(printf %s,%s,%s a{b,c,d} )"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.