CSVを分割したいのですが、中かっこグループ内のカンマ一致を無視して各リストメンバーを繰り返します。以下のコードはうまく機能しますが、中かっこグループ内のコンマを考慮しません。
仮定:
- ここにありますいつも一致する支柱のペア。つまり、
{{ {a,b,c}, x
willのような入力いいえ発生する。
予想出力:
Word='{0,1}'
Word='alpha'
Word='{(x,y,z)}'
Word='{{1,2,3}, {a,b,c}}'
引用:
- スペースの代わりにカンマでリストを分割する方法
- 私は知らないので、Mac OS 10.9.5を使用しています。
パスワード:
#!/bin/bash
#TEST_STRING="alpha, beta, gamma" ## <--- works great for simple case
TEST_STRING="{0,1}, alpha, {(x,y,z)}, {{1,2,3}, {a,b,c}}"
echo "${TEST_STRING}" | sed -n 1'p' | tr ',' '\n' | while read Extracted_Word; do
printf "Word='%s'\n" "${Extracted_Word}"
done
私は123の(現在削除された)ソリューションを適用してみました。
#!/bin/bash
#TEST_STRING="alpha, beta, gamma" ## <--- works great for simple case
TEST_STRING="{0,1}, alpha, {(x,y,z)}, {{1,2,3}, {a,b,c}}"
echo "${TEST_STRING}" \
| sed -n 1'p' \
| sed 's/\({[^}]*\({[^}]*}[^}]*\)*} *\)\(,\|$\) */\1\n/g;:1;s/\(\n[^{}]*\), */\1\n/;t1' \
| tr ',' '\n' \
| while read Extracted_Word; do
printf "Word='%s'\n" "${Extracted_Word}"
done
ただし、これにより、次のエラーメッセージが生成されます。
./testcsv.sh
sed: 1: "s/\({[^}]*\({[^}]*}[^}] ...": bad flag in substitute command: ':'
./testcsv.sh: line 18: {{ {a,b,c}, x: command not found
ベストアンサー1
純粋な試み強く打つ
#!/bin/bash
TEST_STRING="{0,1}, alpha, {(x,y,z)}, {{1,2,3}, {a,b,c}}"
TEST_STRING="$TEST_STRING"","
count=0
newword=''
while [ "${TEST_STRING::1}" ] ; do
l="${TEST_STRING::1}"
TEST_STRING=${TEST_STRING:1}
[ "$l" = '{' ] && ((count++))
[ "$l" = '}' ] && ((count--))
if [ "$l" = ',' ] && ! ((count)) ; then
echo "Word='$newword'"
newword=''
else
if [ "$newword" ] || [ "$l" != " " ] ; then
newword="$newword""$l"
fi
fi
done