如何使用正则表达式搜索键和值并使用jq将值替换为新值

时间:2019-05-23 11:22:18

标签: json regex key jq

implicit def circeJsonDecoder[A](
      implicit decoder: Decoder[A]
  ): EntityDecoder[Task, A] = jsonOf[Task, A]
  implicit def circeJsonEncoder[A](
      implicit encoder: Encoder[A]
  ): EntityEncoder[Task, A] = jsonEncoderOf[Task, A]

我想在所有位置用“ 0.279.0-b1-abc-1234-0716.9856”替换“ 0.279.0-b1-abc-1234-0716.4567”。

My json
{
    "license": " See license.md",
    "dependencies": {
        "@gx/core": "0.279.0-b1-abc-1234-0716.4567",
        "@gx/api": "0.279.0-b1-abc-1234-0716.4567",
        "@gx/name": "0.279.0-b1-abc-1234-0716.4567"
    }
}
        jq '.dependencies[].["@gx/core"] |= (if . == "0.279.0-b1-abc-1234-0716.4567" then "0.279.0-b1-abc-1234-0716.9856" else . end)' info.json

2 个答案:

答案 0 :(得分:1)

如果您打算考虑使用非jq解决方案,请允许我在此处提供一种基于步行路径Unix实用程序 jtc

bash $ <file.json jtc -w'[dependencies]<0\.279\.0\-b1\-abc\-1234\-0716\.4567>R:' -u'"0.279.0-b1-abc-1234-0716.9856"'
{
   "dependencies": {
      "@gx/api": "0.279.0-b1-abc-1234-0716.9856",
      "@gx/core": "0.279.0-b1-abc-1234-0716.9856",
      "@gx/name": "0.279.0-b1-abc-1234-0716.9856"
   },
   "license": " See license.md"
}
bash $ 

步行路径(-w):

  • [dependencies]地址(从根开始)给定记录
  • <...>R:-一个搜索词素,使用RE(后缀R)查找与给定reg.expression匹配的所有(量化词:)条目。

-u将更新(替换)所有找到的匹配项。

-或-

使用您的RE,同时匹配标签和值:

bash $ <file.json jtc -w'[dependencies]<@gx/[a-z]*>L:<^(\d+\.){2}[0-9]+(-[a-zA-Z0-9]*){4}\.[0-9]*$>R' -u'"0.279.0-b1-abc-1234-0716.9856"'
  • 结果相同

PS>披露:我是jtc工具的创建者

答案 1 :(得分:1)

使用jq,有许多方法具有不同的语义,从对第一个问题的这些解决方案中可以看出(没有正则表达式):

walk(if . == "0.279.0-b1-abc-1234-0716.4567" 
     then "0.279.0-b1-abc-1234-0716.9856" else . end)

一种更具针对性的方法:

 .dependencies |=
   map_values(if . == "0.279.0-b1-abc-1234-0716.4567" 
              then "0.279.0-b1-abc-1234-0716.9856" else . end)

正则表达式

上述方法也可以用于正则表达式搜索,例如最后一种情况将变为:

.dependencies |= with_entries(
  if (.key | test("@gx/[a-z]*"))
      and (.value | test("^(\\d+\\.){2}[0-9]+(-[a-zA-Z0-9]*){4}\\.[0-9]*$"))
  then .value = "0.279.0-b1-abc-1234-0716.9856" else . end)

请注意,正则表达式字符串必须为JSON字符串,因此反斜杠加倍。

if(无else

如果您有足够新的jq版本,则那些悬挂的“ else”出现。可以删除。