SED命令卸下特定字符串周围的卷曲括号



我试图仅删除围绕" 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:将文件视为一个字符串,而不是默认的按线

这可能会留下一些额外的新线,但是用其他替换命令很容易替换。

最新更新