Regex 删除两个图案之间的线,包括两个图案

Regex 删除两个图案之间的线,包括两个图案,regex,perl,cisco-ios,Regex,Perl,Cisco Ios,我有一个标量变量,它包含文件中的一些信息。我的目标是去掉变量(或文件)中任何包含“管理性关闭”字样的多行条目 格式与此类似: 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 Eth

我有一个标量变量,它包含文件中的一些信息。我的目标是去掉变量(或文件)中任何包含“管理性关闭”字样的多行条目

格式与此类似:

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的方法,那也行。

那么,您想从包含“管理性向下”的行的开头删除到并包括下一个空行(两个连续的换行)

s/
=regex替换

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

管理性向下
=文本,后跟

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

\n\n
=两行换行符

/
=无需替换(即删除)


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

因此,您希望从包含“管理性向下”的行的开头删除并包括下一个空行(两个连续换行符)

s/
=regex替换

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

管理性向下
=文本,后跟

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

\n\n
=两行换行符

/
=无需替换(即删除)


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

您可以使用以下模式:

(?<=\n\n|^)(?>[^a\n]++|\n(?!\n)|a(?!dministratively down\b))*+administratively down(?>[^\n]++|\n(?!\n))*+
(?[^a\n]++\n(?!\n)| a(?!管理性关闭\b))*+管理性关闭(?>[^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
(?#打开一个原子组
[^a\n]++#所有这些都不是“a”或换行符
|#或
\n(?!\n)#新行后面没有新行
|#或
a(?行政上不合格\b)#“a”后面不跟“行政上不合格”
)*+#将原子组重复零次或多次
行政性关闭#“行政性关闭”本身
#本段末尾
(?>#打开一个原子群
[^\n]++#所有这些都不是新行
|#或
\n(?!\n)#新行后面没有新行
)*+#将原子组重复零次或多次

您可以使用以下模式:

(?<=\n\n|^)(?>[^a\n]++|\n(?!\n)|a(?!dministratively down\b))*+administratively down(?>[^\n]++|\n(?!\n))*+
(?[^a\n]++\n(?!\n)| a(?!管理性关闭\b))*+管理性关闭(?>[^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
(?#打开一个原子组
[^a\n]++#所有这些都不是“a”或换行符
|#或
\n(?!\n)#新行后面没有新行
|#或
a(?行政上不合格\b)#“a”后面不跟“行政上不合格”
)*+#将原子组重复零次或多次
行政性关闭#“行政性关闭”本身
#本段末尾
(?>#打开一个原子群
[^\n]++#所有这些都不是新行
|#或
\n(?!\n)#新行后面没有新行
)*+#将原子组重复零次或多次
使用Perl的段落模式 Perl有一种很少使用的将空行用作记录分隔符的语法:
-00
标志;有关详细信息,请参阅

例子 例如,给定以下语料库:

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
使用Perl的段落模式 Perl有一种很少使用的将空行用作记录分隔符的语法:
-00
标志;有关详细信息,请参阅

例子 例如,给定以下语料库:

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

这个答案非常棒。这也解决了我的问题。非常感谢。相关的,我是这样应用它的:我的$new\u out=
perl-00ne'打印除非/administratively down/'${hostname}\u stats\u middial
有没有比backticks更酷的方法呢?@jyaworski您可以编写自己的循环,用修改过的输入记录分隔符(
$/
)或触发器操作符读取文件,但它似乎还有很多工作要做,可能不会那么优雅。当然是YMMV。这个答案非常棒。这也解决了我的问题。非常感谢。相关的,我是这样应用它的:我的$new\u out=
perl-00ne'打印除非/administratively down/'${hostname}\u stats\u middial
有没有比backticks更酷的方法呢?@jyaworski您可以编写自己的循环,用修改过的输入记录分隔符(
$/
)或触发器操作符读取文件,但它似乎还有很多工作要做,可能不会那么优雅。当然是YMMV。