如何用sed将YAML对象转换为指定格式的JSON字符串?
问题描述
我有如下YAML格式的输入:
input="poc_string: 'This is my succeeding string!' poc_fail: false"
期望转换为JSON格式的字符串:
'{"poc_string":"This is my succeeding string!","poc_fail":false}'
需要完成的修改点:
- 将"This is my succeeding string!"两侧的单引号替换为双引号
- 除
true或false外,冒号前后的所有字符串需用双引号包裹 - 换行符替换为逗号,但末尾的换行符不添加逗号
作为sed和bash新手,我尝试了以下命令:
output=$(echo $sql | sed -r "s/'/\"/g" | sed -r "s/: /:/g"| sed -rE "s/(\w*):/\"\&\"/g") echo $output
前两步替换(单引号转双引号、去除冒号后空格)正常,但第三步给冒号前文本添加引号失败,当前输出为:poc_string:'This is my succeeding string!' poc_fail:false
环境为Ubuntu 22.04.3,请问如何得到期望的输出?
解决方案
可以用一条整合的sed命令完成所有转换,同时修正你之前的正则和变量引用问题:
output=$(echo "$input" | sed -r " s/'([^']+)'/\"\1\"/g; s/^([^:]+):/\"\1\":/; s/: (true|false)/:\1/g; s/: ([^"]+)/:\"\1\"/g; $!s/$/,/; 1s/^/{/; $s/$/}/; ") echo "$output"
关键修正点说明:
- 变量引用要加双引号:
echo "$input",避免原文本中的空格和换行被bash截断 - 精准匹配单引号包裹的内容:
s/'([^']+)'/\"\1\"/g,只替换值两侧的单引号,不会误操作其他单引号 - 给键名加引号:
s/^([^:]+):/\"\1\":/,匹配每行开头到冒号的内容,用捕获组给键名套双引号 - 特殊处理布尔值:
s/: (true|false)/:\1/g,保留true/false的原生JSON格式(不加引号) - 给普通值加引号:
s/: ([^"]+)/:\"\1\"/g,给未被双引号包裹的值添加双引号 - 行尾加逗号:
$!s/$/,/,仅给除最后一行外的行末尾添加逗号 - 包裹JSON结构:
1s/^/{/; $s/$/}/,在第一行开头加{,最后一行结尾加}
内容的提问来源于stack exchange,提问作者moys
相关产品推荐
相关产品推荐

