You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:35:10