bash forループで生成された文字列から最後のコンマを削除します。

bash forループで生成された文字列から最後のコンマを削除します。

配列から区切り文字でカンマ区切りリストを作成し、最後のカンマを削除する必要がある状況で作業しています。私はbashforパイピングを使用してsedすべてのカンマを削除しますが、最後のカンマは削除しません。単純化された例は次のとおりです。

x=$(for i in a b c; do echo "${i}",; done| sed 's/,$//')
echo $x
a b c

希望の出力:

a, b, c

どんな提案にも感謝します。

答え1

一つの選択肢は持続することですbash

arr=(a b c)
x=$(IFS=,;printf  "%s" "${arr[*]}")
echo "$x"
a,b,c

交互に

arr=(a b c)
printf -v x "%s," "${arr[@]}"
x=${x%,}
echo "$x"
a,b,c

2番目のオプションでは、区切り文字を個別に設定する,のではなく(カンマの後にスペースが続く)ように設定できます。,

printf -v x "%s, " "${arr[@]}"
x=${x%, }
echo "$x"
a, b, c

答え2

別の有用な技術は次のとおりですpaste -s

$ arr=(a b c)
$ printf "%s\n" "${arr[@]}" | paste -sd,
a,b,c

paste -sd,これは非常に一般的な「改行で区切られた項目のセットをカンマで区切られたリストに変換する」操作です。)

答え3

問題は、デフォルトで echo呼び出されるたびに新しい行を追加し、sedその新しい行で機能することです。$(...)Bashが新しい行を処理すると、これらの新しい行が空白に変換されるため、この内容は表示されません。したがって、アプローチを最小限に変更しながら問題を解決するには、次の手順を実行します。

$ x=$(for i in a b c; do echo -n "${i}",; done| sed 's/,$//') ; echo $x
a,b,c

このオプションは、新しい行を追加しないように指示-nします。echo

アイテム間にスペースが必要な場合は簡単に追加できます。

$ x=$(for i in a b c; do echo -n "${i}, " ; done| sed 's/, $//') ;echo $x
a, b, c

答え4

$ w=(a b c)

$ IFS=, eval 'echo "${w[*]}"'
a,b,c

ちなみに、そうではありませんか? 車輪を再発明する ここ?

関連情報