我试图仅删除围绕" cidrip"的卷曲括号:" 0.0.0.0/0"有人可以帮忙吗?谢谢!
输入:
{
"FromPort": 1024,
"ToPort": 65535,
"IpProtocol": "udp",
{
"CidrIp": "0.0.0.0/0"
},
{
"CidrIp": "0.0.0.0/0"
}
]
}
输出:
{
"FromPort": 1024,
"ToPort": 65535,
"IpProtocol": "udp",
"CidrIp": "0.0.0.0/0",
"CidrIp": "0.0.0.0/0"
]
}
sed不了解JSON。SED是面向线的编辑/解析器。JSON可以写在一行,多行等上。无论您为JSON创建哪种模式,它都不是一致或可靠的。
使用JQ解析JSON。然后,您可以在JQ输出上使用SED,CUT等工具。
JQ
如果空格可重复,如果输入是有限的,如果您知道这是一个hack,而不是正确处理结构化数据的方法,那么
: sed '/{/{N;/Cidr/{N;s/[^n]*n//;s/n.*//;s/ //;}}' input-file
-
/{/
用于匹配打开卷曲的行-
N
将下一行添加到模式空间 -
/Cidr/
对于匹配" CIDR"的图案空间-
N
获取下一行 -
s/[^n]*n//
删除第一行 -
s/n.*//
删除最后一行 -
s/ //
删除一些空格以删除" cidr"数据
-
-
如果真实的输入数据正在使用选项卡,则可能需要修改最后一个空间删除。我的快速测试柜结束了空间。
sed -i -r -z "s,{([^{}]*CidrIp[^{}]*)},1,g" input-file
REGEX101演示
-i:就地(输出文件与输入相同(
-r:扩展正则
-z:将文件视为一个字符串,而不是默认的按线
这可能会留下一些额外的新线,但是用其他替换命令很容易替换。