- 论坛徽章:
- 84
|
10可用积分
本帖最后由 yjh777 于 2014-07-01 15:24 编辑
$ yamlStr='type: abc, attr: "x,y,z", name: kskdf sdf'
以逗号','分隔的键值对 key1: value1, key2: "first part of value2, second part of value2", key3: value3
其中value中可能有逗号, 请教怎么把这些键值对儿分开保存到一个数组里面?
试了IFS=,的方法,不好用:
$ eval IFS=, read -a aa <<< "$yamlStr"
$ for k in "${!aa[@]}"; do echo "$k-->${aa[$k]}"; done
0-->type: abc
1--> attr: "x
2-->y
3-->z"
4--> name: kskdf sdf
期望结果:
0-->type: abc
1--> attr: "x,y,z"
2--> name: kskdf sdf
请教大家有什么好方法?
---------------
发现最佳答案给错了,其实 jason680 和 damcool 给的答案更好;
基于jason680状态机方法的改进代码:- #awk
- BEGIN {FS=""; P=0; S=0}
- {
- for(n=1;n<=NF;n++) {
- if ($n==" " && $(n-1)==" " && P==0 && S==0)
- continue
- if ($n=="," && P==0 && S==0) {
- print gensub("^ ", "", 1, s); s=""
- } else {
- s=s$n;
- if(S==0 && $n=="\"" && $(n-1)!="\\")
- P=(P+1)%2;
- if(P==0 && $n=="'")
- S=(S+1)%2
- }
- }
- }
- END {print gensub("^ ", "", 1, s)}'
复制代码 |
|