我有这样的文本,我想只隐藏某些字段的值:l1
和x2
。下面是示例:
{
"info":
{
"l1": 77,
"x2": 77,
},
"user": "2323",
"id": "xxxx",
"time": 1679955931845,
"msgType": "oyui"
}
我已经想出了一个完美的正则表达式,它可以很好地工作为“正则表达式”:(?<=(l1|x2)":)(.*?)(?=,)
但现在我想在Linux中使用它与sed
,这似乎太复杂了。在一天结束时,我让它在两个sed
语句中工作,但现在我找不到自己的位置,因为不知道如何在一个正则表达式中使用`sed。
更新
如果有人会在这样的问题上停下来,有很好的答案。但是,在我的情况下,我特别需要使用sed
语句,因为这是其他服务中配置所需的输入(在我的情况下,Splunk和Field Filtering选项与sed
https://docs.splunk.com/Documentation/Splunk/9.0.4/Security/setfieldfiltering)
2条答案
按热度按时间jtoj6r0c1#
sed
不支持您尝试使用的方言。但Perl支持。Splunk基本上是从Perl(或者PCRE?)借用了它的正则表达式引擎,所以在Perl和Splunk之间来回应该是方便和自然的(尽管我认为如果你设法离开,你永远不会想回去...)
Perl与
sed
有一些表面上的相似之处,因此您可以说:如果你熟悉
sed
,它应该是相当透明的。甚至有一个工具s2p
可以自动将sed
脚本转换为Perl脚本。顺便说一句,许多Splunk模式似乎使用命名组;你可以使用Perl中内置的hash
%+
来访问它们。1可能参见Why are there so many different regular expression dialects?
如果你真的需要特别使用
sed
,你需要将正则表达式重构为BRE或至少一个ERE -如果你的sed
有一个(非标准,但常见)-r
或-E
选项,后者是可行的;这显然不是完全等价的lookarounds在传统正则表达式中没有真实的的等价物,所以我只是将它们转换为常规匹配;而
[^,]*
与.*?
完全不同,但在这种情况下,我猜这就是你的意思。如果没有看到实际数据,很难判断,但我无法想象非贪婪正则表达式会做不同的事情。(更一般地说,[^,]*
不能匹配逗号,而逗号之前的.*?
仍然可以匹配逗号,如果这将允许整个正则表达式达到匹配。如果没有更多关于你希望括号中的组应该做什么的信息,这显然只能是如何实际解决你的问题的一个提示。
相应的POSIX BRE正则表达式在每个
(
、|
或)
之前都有反斜杠。1哈希名为
%+
,但单个哈希值的访问方式类似于$+{"key"}
。助记符是%
是整个哈希的sigil,$
是标量的sigil,例如哈希中的单个值。许多人批评Perl的“《双城之战》”语法,但他们显然没有见过Splunk的语法。
yacmzcpb2#
对于jq,首先修复无效的
JSON
(即删除"x2": 77,
末尾的逗号),因为jq
失败并显示显式错误:你得去掉一个逗号。
或者: