使用正则表达式查找和删除 JSON 代码

using regular expressions to find and remove json code

提问人:Gabe 提问时间:9/26/2023 最后编辑:Gabe 更新时间:9/26/2023 访问量:69

问:

我需要删除一个带有 ignition 的项目中的 100,000 多个标签。我认为最好的方法是下载文件的 json 并删除不同设备中一致标签的所有实例。例: 我需要在数百个设备中删除此标签(和其他标签),它们将与FV5003接受的所有其他标签相同,其中可能是PP2340或AG7698。

            {
              "valueSource": "opc",
              "opcItemPath": "ns\u003d1;s\u003d[PPD]FV5003_HOA.State.IO_Open",
              "dataType": "Boolean",
              "name": "IO_Open",
              "tagType": "AtomicTag",
              "opcServer": "Ignition OPC UA Server"
            },

有没有办法删除所有这样的实例,使 FV5003 成为正则表达式中的通配符。 我在正则表达式方面的经验为零。我也在使用 vscode。

任何帮助都会很棒, 谢谢。

json 正则表达式 替换 scada-ignition

评论

0赞 armagedescu 9/26/2023
JSON不是常规语言。它是与上下文无关的语言。但常规语言是上下文无关语言的一个子集。因此,您不能使用正则表达式来删除 json。
1赞 Razzer 9/26/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。
0赞 Gabe 9/26/2023
代码并不真正相关。我只想删除括号内的所有内容。没有使用通配符删除的工具吗?
0赞 bobble bubble 9/26/2023
你的意思是像 {[^}{]*?\[PPD\](?:FV5003|PP2340|AG7698)_[^}{]*}, (regex101)?如果是这样,是否总是有一个 before 和一个 underscore after 来标识?块内是否有任何大括号......[PPD]
0赞 Gabe 9/26/2023
好吧,零件编号只是例子。我想要全部删除,因为我有一百个零件号

答:

1赞 jhnc 9/26/2023 #1
jq '
  del(
    .. |
    select(type=="object") |
    select(has("opcItemPath")) |
    select(
      .opcItemPath|
      test("\\Ans\u003d1;s\u003d\\[PPD\\].*_HOA.State.IO_Open\\Z")
    )
  )
' input.json
  • ..- 走结构
  • select:
    • 对象
    • 包含名为opcItemPath
    • 其值与正则表达式匹配test
  • del给他们打电话

或者,“删除括号内的所有内容”:

jq '
  (
    .. |
    select(
      .opcItemPath |
      test("\\Ans\u003d1;s\u003d\\[PPD\\].*_HOA.State.IO_Open\\Z")
    )?
  ) |= {}
' input.json
  • |=- 将所选对象更新为空对象{}
  • ?- 丢弃因省略前两个过滤器而可能产生的错误select