【问题标题】:sed with multi line selecting with regexsed 使用正则表达式进行多行选择
【发布时间】:2019-02-09 23:49:03
【问题描述】:

我需要获取一个已转换的文件(防火墙迁移),它会添加一个巨大的 cmets 部分。我想替换 ("") 之间的所有内容。

所以,在这个例子中,我想让输出说

set comments " "

这是我尝试过的:

sed 's/.*set comments* ".*"/set comment "" /' %filename% >> %outputfilename%

问题是一些“cmets”有多行,我的命令没有考虑到这一点。因此,其中没有 /r 或 /n 的那些可以正常工作。

实际文件

set action accept    
set comments "access-list inside_access_in extended permit udp host 10.2.55.131 host 192.168.0.65 eq snmp 
This policy is disabled as not allowed by NAT-Control."   
next

【问题讨论】:

    标签: regex sed replace find


    【解决方案1】:

    使用 GNU sed for -z 并使用 -E 启用 ERE:

    $ sed -Ez 's/(set comment)s? "[^"]*"/\1 " "/g' file
    set action accept
    set comment " "
    next
    

    如果您的 cmets 可以包含双引号,无论是否转义,上述操作都会失败。如果可能发生这种情况,那么您应该将其包含在您的示例输入中。

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed):

      sed '/set comments "/!b;:a;/"[^\\"]*\(\\.[^\\"]*\)*"/bb;N;ba;:b;s//" "/' file
      

      这将忽略除包含字符串set comments " 之外的行。然后它检查该行是否包含结束的未加引号的双引号,如果没有则累积行直到满足条件。最后,它会删除开始/结束双引号之间的所有字符,并用一个空格替换它们。

      附:我怀疑 OP 并不是要用 comment 替换 comments,但它是对第二个正则表达式和替换命令的 RHS 的微不足道的更改(如果它是有意的)。

      【讨论】:

        【解决方案3】:

        您需要使用 sed 吗?

        perl -0777pe 's/set comments "[^"]*"/set comments " "/gm' input.txt
        

        生产

        set action accept    
        set comments " "   
        next
        

        来自您的示例输入。

        (如果您的评论字符串本身可以包含转义的引号,则变得更加困难。)

        【讨论】:

        • 当我使用 perl 命令时,它删除了 "" edit 10000 set srcintf " " set dstintf " " set srcaddr " " set dstaddr " " set service " " set schedule " " set logtraffic禁用设置状态启用设置操作拒绝设置 cmets " "
        • 你说你想替换引号中的文本,我假设你的意思是所有引用的字符串。当然,如果您有一些想要保留的内容,则必须调整正则表达式。我会在我的回答中这样做。
        猜你喜欢
        • 1970-01-01
        • 2019-09-04
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多