regex 正则表达式在sed中替换Json值

7rtdyuoh  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(153)

我有这样的文本,我想只隐藏某些字段的值:l1x2。下面是示例:

{
    "info":
    {
        "l1": 77,
        "x2": 77,
    },
    "user": "2323",
    "id": "xxxx",
    "time": 1679955931845,
    "msgType": "oyui"
}

我已经想出了一个完美的正则表达式,它可以很好地工作为“正则表达式”:(?<=(l1|x2)":)(.*?)(?=,)但现在我想在Linux中使用它与sed,这似乎太复杂了。在一天结束时,我让它在两个sed语句中工作,但现在我找不到自己的位置,因为不知道如何在一个正则表达式中使用`sed。

更新

如果有人会在这样的问题上停下来,有很好的答案。但是,在我的情况下,我特别需要使用sed语句,因为这是其他服务中配置所需的输入(在我的情况下,Splunk和Field Filtering选项与sedhttps://docs.splunk.com/Documentation/Splunk/9.0.4/Security/setfieldfiltering

jtoj6r0c

jtoj6r0c1#

sed不支持您尝试使用的方言。但Perl支持。

perl -ne 'if (m/(?<=(l1|x2)":)(.*?)(?=,)/) { print "$1: $2\n" }'

Splunk基本上是从Perl(或者PCRE?)借用了它的正则表达式引擎,所以在Perl和Splunk之间来回应该是方便和自然的(尽管我认为如果你设法离开,你永远不会想回去...)
Perl与sed有一些表面上的相似之处,因此您可以说:

perl -pe 's%(?<=foo)bar(?=baz)%quux%g'

如果你熟悉sed,它应该是相当透明的。甚至有一个工具s2p可以自动将sed脚本转换为Perl脚本。
顺便说一句,许多Splunk模式似乎使用命名组;你可以使用Perl中内置的hash %+来访问它们。1

perl -ne 'if (m/(?<=(?P<thing>l1|x2)":)(?P<value>.*?)(?=,)/) { print "$+{thing}: $+{value}\n" }'

可能参见Why are there so many different regular expression dialects?
如果你真的需要特别使用sed,你需要将正则表达式重构为BRE或至少一个ERE -如果你的sed有一个(非标准,但常见)-r-E选项,后者是可行的;

sed -nE 's/.*(l1|x2)":([^,]*),.*/"\1": "\2"/p'

这显然不是完全等价的lookarounds在传统正则表达式中没有真实的的等价物,所以我只是将它们转换为常规匹配;而[^,]*.*?完全不同,但在这种情况下,我猜这就是你的意思。如果没有看到实际数据,很难判断,但我无法想象非贪婪正则表达式会做不同的事情。(更一般地说,[^,]*不能匹配逗号,而逗号之前的.*?仍然可以匹配逗号,如果这将允许整个正则表达式达到匹配。
如果没有更多关于你希望括号中的组应该做什么的信息,这显然只能是如何实际解决你的问题的一个提示。
相应的POSIX BRE正则表达式在每个(|)之前都有反斜杠。
1哈希名为%+,但单个哈希值的访问方式类似于$+{"key"}。助记符是%是整个哈希的sigil,$是标量的sigil,例如哈希中的单个值。
许多人批评Perl的“《双城之战》”语法,但他们显然没有见过Splunk的语法。

yacmzcpb

yacmzcpb2#

对于jq,首先修复无效的JSON(即删除"x2": 77,末尾的逗号),因为jq失败并显示显式错误:

parse error: Expected another key-value pair at line 6, column 5

你得去掉一个逗号。

$ jq 'del(.info.l1, .info.x2)' file
{
  "info": {},
  "user": "2323",
  "id": "xxxx",
  "time": 1679955931845,
  "msgType": "oyui"
}

或者:

$ jq '(.info.l1, .info.x2)=""' file
{
  "info": {
    "l1": "",
    "x2": ""
  },
  "user": "2323",
  "id": "xxxx",
  "time": 1679955931845,
  "msgType": "oyui"
}

相关问题