One line join function in shell script
joinってのはimplodeとか文字列結合の方のです。
joinコマンドは便利だけど、別機能ですし。
IFSいじるのは戻し忘れ怖いし、ワンラインで行きたい気持ちがあります。
複数行出力させてpaste -s -d
するんですが、
読み込み元に応じた出力方式を忘れるので、その備忘録。
囲み文字 : '
, デリミタ : ,
でSQLのIN句パターンです。
# 配列から生成
list=(
'foo'
'bar'
'hoge hoge'
)
joined=$(printf "'%s'\n" "${list[@]}" | paste -s -d ,)
# 複数行の文字列から生成
list='
foo
bar
hoge hoge
'
joined=$(echo "$list" | sed -e '/^$/d' -e "s/.\+/'&'/" | paste -s -d ,)
joined=$(echo "$list" | awk 'NF > 0 {print "'\''"$0"'\''"}' | paste -s -d ,)
# ファイルから生成
cat list
# =>
# foo
# bar
# hoge hoge
joined=$(sed "s/.\+/'&'/g" list | paste -s -d ,)
# 結果
echo $joined
# => 'foo','bar','hoge hoge'