【问题标题】:Sed replace inside a json file with regex用正则表达式替换 json 文件中的 Sed
【发布时间】:2025-12-31 05:10:11
【问题描述】:

我有一个巨大的 json 文件,我将复制其中的一部分:

"panels": [
 "targets": [
{
  "alias": "First Prod",
  "dimensions": {
    "Function": "robot-support-dev-create-human"
  },
}
{
  "alias": "Second Prod",
  "dimensions": {
    "Function": "robot-support-prototype-dev-beta-activate-human"
  },
}
{
  "alias": "third Prod",
  "dimensions": {
    "Function": "robot-support-dev-jira-kill-human"
  },
}  
{
   "alias": "Somehting",


 "dimensions": {
    "Robotalias": "default",
    "RobotName": "Robot-prod-prototype",
    "Operation": "Fight"
  },
]
]

我想在函数每次包含 robot-support-devrobot-support-prod-... 时对其执行正则表达式

sed -i ' s/"robot-support-([a-zA-Z0-9_]+)-dev-([^"]+)"/robot-support-\\1-prod-\\2/g;'

这就是我所做的,但我的正则表达式可能有问题

【问题讨论】:

  • 请提供有效的 JSON 数据样本。

标签: linux sed jq


【解决方案1】:

您无法将 json 与正则表达式匹配。 “正确的方法(TM)”是首先使用像jq这样的json感知工具提取Function,然后使用sed对其进行修改,然后使用json感知工具将其插入。

Sed 默认使用 basic regex,因此您需要将 ( ) + 更改为 \( \) \{1,\}\+ 是 GNU 扩展)或使用 GNU sed使用 sed -E 来使用扩展的正则表达式。此外,\\1 将被解释为 2 个字符 \1,您想将 \1 与单个 \ 一起使用。但无论如何,您的正则表达式只是无效的,并且与您想要的不匹配(我猜)。此外,替换字符串的右侧缺少",因此您的命令只会删除"。只需替换您需要的,尝试:

sed 's/"robot-support-dev-/"robot-support-prod-/g;'

【讨论】:

    【解决方案2】:

    正如@KamilCuk 所指出的,您当前使用的正则表达式存在一些问题。我认为,如果您作为示例给出的事件是唯一的可能性,那么如果您匹配这些组,它将起作用:

    sed -i 's/"robot-support\(-\|-.*-\)dev-\(.*\)"/"robot-support\1prod-\2"/g'
    

    【讨论】:

      【解决方案3】:

      正如本页其他地方所指出的,使用sed 处理此类问题充其量是充满危险的。由于该问题已标记为,因此应该指出jq 非常适合此类问题。特别是,可以使用 arity 2 或 3 的过滤器sub 获得一个简单的解决方案,即sub/3: sub("FROM"; "TO"; "g")。

      您可能还希望使用walk,这样您就不必担心“功能”键的确切位置,例如

      walk( if type == "object" and (.Function|type) == "string"
            then .Function |= sub( "robot-support-(?<a>([^-]+-)?)dev-"; "robot-support-\(.a)prod-"; "g")
            else . end)
      
      

      【讨论】: