【问题标题】:Delete lines between and including two patterns删除两个模式之间并包含两个模式的线
【发布时间】:2013-08-08 17:22:05
【问题描述】:

我有一个标量变量,其中包含文件内的一些信息。我的目标是从包含“Administratively down”字样的任何多行条目中删除该变量(或文件)。

格式类似这样:

Ethernet2/3 is up
... see middle ...
a blank line
VlanXXX is administratively down, line protocol is down
... a bunch of text indented by two spaces on multiple lines ...
a blank line
Ethernet2/5 is up
... same format as previously ...

我在想,如果我可以匹配“管理性向下”和前导换行符(对于空白行),我就可以对变量应用一些逻辑来删除这些行之间的行。

我目前正在使用 Perl,但如果有人可以给我一个 ios 的方式来执行此操作,那也可以。

【问题讨论】:

    标签: regex perl cisco-ios


    【解决方案1】:

    使用 Perl 的段落模式

    Perl 有一个很少使用的语法来使用空行作为记录分隔符:-00 标志;详情请见Command Switches in perl(1)

    示例

    例如,给定一个语料库:

    Ethernet2/3 is up
    ... see middle ...
    
    VlanXXX is administratively down, line protocol is down
    ... a bunch of text indented by two spaces on multiple lines ...
    
    Ethernet2/5 is up
    

    您可以使用提取所有段落除了您不想要的段落使用以下单行:

    $ perl -00ne 'print unless /administratively down/' /tmp/corpus
    

    样本输出

    当针对您的语料库进行测试时,单行产生:

    Ethernet2/3 is up
    ... see middle ...
    
    Ethernet2/5 is up
    

    【讨论】:

    • 这个答案非常棒。它也解决了我的问题。为此非常感谢。相关,我以这种方式应用它:my $new_out = perl -00ne 'print unless /dministratively down/' ${hostname}_stats_interim 有没有比反引号更酷的方法来做到这一点?
    • @jyaworski 您可以编写自己的循环以使用修改后的输入记录分隔符 ($/) 或触发器运算符来读取文件,但这似乎需要更多的工作,而且可能不会那么优雅。当然是 YMMV。
    【解决方案2】:

    那么,您想从包含“administratively down”的行的开头删除到并包括下一个空白行(两个连续的换行符)?

    $log =~ s/[^\n]+administratively down.+?\n\n//s;
    

    s/ = 正则表达式替换

    [^\n]+ = 任意数量的字符,不包括换行符,后跟

    administratively down = 文字,后跟

    .+? = 任意数量的文本,包括换行符,非贪婪匹配,后跟

    \n\n = 两个换行符

    // = 替换为空(即删除)

    s = 单行模式,允许. 匹配换行符(通常不匹配)

    【讨论】:

      【解决方案3】:

      你可以使用这个模式:

      (?<=\n\n|^)(?>[^a\n]++|\n(?!\n)|a(?!dministratively down\b))*+administratively down(?>[^\n]++|\n(?!\n))*+
      

      详情:

      (?<=\n\n|^)  # preceded by a newline or the begining of the string
      # all that is not "administratively down" or a blank line, details:
      (?>                               # open an atomic group
          [^a\n]++                      # all that is not a "a" or a newline
        |                               # OR
          \n(?!\n)                      # a newline not followed by a newline
        |                               # OR
          a(?!dministratively down\b)   # "a" not followed by "dministratively down"
      )*+                               # repeat the atomic group zero or more times
      administratively down             # "administratively down" itself
      # the end of the paragraph
      (?>                          # open an atomic group          
          [^\n]++                  # all that is not a newline
        |                          # OR
          \n(?!\n)                 # a newline not followed by a newline
      )*+                          # repeat the atomic group zero or more times
      

      【讨论】:

        猜你喜欢
        • 2021-10-15
        • 1970-01-01
        • 2016-12-02
        • 2020-06-12
        • 1970-01-01
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多