次のような文字列があります。
a1="a,b,c,(d,e),(f,g)";
配列を取得する方法
arr=["a","b","c","d,e","f,g"];
括弧の間のカンマを別の文字に置き換え、配列に変換した後に元に戻したい
しかし、括弧の間のコンマだけを置き換える方法がわかりません。これはどのように行うことができますか?
sed 's/,/\",\"/g;s/(\(.\)\"/\1/g;s/\"\(.\))/\1/g;s/^\w\+=\"/arr=[\"/;s/;/];/'
正規表現を使用して文字列を解析するbashスクリプトに従ってみてください。私には厄介ですが、うまくいくようです:
#!/usr/bin/env bash
unset arr
a1="a,b,c,xxx(d,e),sdf(f,g)"
## The regular expression does an alternation between
## a pair of parens followed by an optional comma "\([^\)]+\)(,?)"
## or any characters followed by a comma or end of line "[^,]+(,|$)"
## After that I save all the rest of the string to match it in
## following iterations.
while [[ $a1 =~ ([^\(,]*\([^\)]+\)(,?)|[^,]+(,|$))(.*) ]]; do
## BASH_REMATCH keeps grouped expressions. The first one
## has the data extracted between commas. This removes the
## trailing one.
elem="${BASH_REMATCH[1]%,}"
## Remove opening paren, if exists one.
elem="${elem/\(/}"
## Remove trailing paren, if exists one.
elem="${elem%)}"
## Add element to an array.
arr+=("$elem")
## Use the string left (fourth grouped expression in
## the regex) to continue matching elements.
a1="${BASH_REMATCH[4]}"
done
printf "%s\n" "${arr[@]}"
次のように実行します。
bash script.sh
次の結果が得られます。
a
b
c
xxxd,e
sdff,g