【问题标题】:Perl replace match+nextline+matchPerl替换匹配+下一行+匹配
【发布时间】:2017-08-12 20:02:09
【问题描述】:

我在文件中有行:

Desktop DELL firewall UP CPU 20core configured 
Desktop HP firewall DOWN CPU 18core unconfigured

我想先匹配UP,然后如果下一行匹配DOWN,则用一些字符串替换这两行

我试过了

perl -p -e 's?.*firewall.*UP.*\n.*firewall.*DOWN.*?STRG?' file

但它不起作用

【问题讨论】:

标签: regex perl sed str-replace


【解决方案1】:

/\n.*f/ 不可能匹配,因为您一次读取一个以换行符结尾的行。

一个方便的技巧是使用-0777 一次将整个文件加载到内存中。

perl -0777pe's/^.*firewall.*UP.*\n.*firewall.*DOWN.*/STRG/m' file

【讨论】:

    【解决方案2】:

    使用 sed:

    sed '/firewall.*UP/{N;/firewall[^\n]*DOWN/s/.*/somestr/}' file
    

    详情:

    /firewall.*UP/ {      # condition
        N;                # append the next line to the pattern space
        /firewall[^\n]*DOWN/  # condition
            s/.*/somestr/ # then: replace all with somestr
    }
    

    【讨论】:

    • 如果DOWNUP 在同一行,这会产生误报吗?
    • @potong:显然是的,但我怀疑这会发生。但是,我将用 [^\n]* 替换第二个 .* 以确保 firewallDOWN 在同一行(第二个)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多