【问题标题】:Replace JSON key using SED使用 SED 替换 JSON 密钥
【发布时间】:2017-08-07 12:35:16
【问题描述】:

我正在尝试使用带有 sed 的 -i 标志获取 JSON 密钥并更改其在文件中的属性。问题是,我无法正确使用此正则表达式。它适用于简单的替换案例,但我无法使用这个正则表达式让它工作。为简单起见,我只是尝试了一个简单的回显,而不是将其保存到文件中。想法?

 x=0.0.179     
 echo "version: 0.0.178" | sed 's/^[ ]*\"version\"[ ]*:[ ]*\"\([0-9]+\.[0-9]+\.[0-9]+\)\".*$/\$x/'
 0.0.178

【问题讨论】:

  • 你的 JSON 是什么,你期望什么,你实际得到什么?
  • 如果您尝试编辑 JSON,可以使用相应的工具(例如 jq)。使用 sed 的方法可能会在某个时候中断。
  • @brian 我认为期望在我的问题中得到了很好的解释。我期望将 0.0.178 替换为 0.0.179。我只限于sed,所以我不能使用jq。有没有办法用 sed 做到这一点?
  • 不安装jq有什么原因吗?你的服务器没有安装 Python 吗?

标签: json string bash sed replace


【解决方案1】:

你为什么要用 sed 把它复杂化,就这样吧,

x="0.0.179"
echo "version: 0.0.178" | sed  "s/version: .*/version: $x/"
version: 0.0.179

BTW如果您的JSON 输入可以通过jq 进行解析和修改,那就去吧。将此用作最后的手段。

【讨论】:

  • 这是一个非常可靠的答案。如果在表达式中包含任何反斜杠,则很难将 sed 与双引号表达式一起使用。详情请见stackoverflow.com/questions/2369314/…
  • 我完全同意:在 sed 中使用 " 是不好的做法。
【解决方案2】:

我认为您的 sed 正则表达式正在寻找版本号 within 双引号。您在上面的 sed 输入没有被引用,因此不会被替换(我希望您的 JSON 被双引号,因此我对您真正的 JSON 输入感兴趣)。

【讨论】:

    【解决方案3】:

    这行得通。在$x 周围提及's

    echo "version: 0.0.178" | sed 's/^[ ]*\"version\"[ ]*:[ ]*\"\([0-9]+\.[0-9]+\.[0-9]+\)\".*$/\'$x'/'
    

    Bash 变量不会在字符串中被替换为 '。尽可能使用" 来避免这种情况,或者只是将变量连接到命令中,如上所示。

    【讨论】:

    • 是的,也可以短这个。但我试图回答具体问题。
    猜你喜欢
    • 2020-07-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2017-01-07
    • 2021-11-20
    • 1970-01-01
    • 2017-12-17
    相关资源
    最近更新 更多