gpt4 book ai didi

regex - 使用 Powershell 和 Regex 从文本文件中提取行 block

转载 作者:行者123 更新时间:2023-12-02 23:38:15 26 4
gpt4 key购买 nike

我正在开发 Powershell 脚本和 .Net Regex,以使用 powershell 和 regex 在网络设备配置中查找模式匹配。我在尝试从配置文件中提取字符串块时遇到问题,并且在编写正则表达式以匹配回车和新行时也遇到问题。下面是我的例子。我有一个配置文件,其中包含我想提取的信息

vlan no  description  ports999      unused       Gi1/2,Gi1/3, Gi1/4, Gi1/5, Gi1/6, Gi/7, Gi/8, Gi1/9                      Gi1/0, Gi1/11, Gi1/12, Gi1/13, Gi1/14, Gi1/15, Gi1/16                      Gi1/17, Gi1/18

Here is my code

$File = Get-content C:\config.txt

$Regex = "(?sm)(^999.*(\r\n\s+.*)"
$unused_ports = Select-String -path $File -Pattern $Regex
Write-host $Unused_ports

它只显示第一行
999      unused       Gi1/2,Gi1/3, Gi1/4, Gi1/5, Gi1/6, Gi/7, Gi/8, Gi1/9

I also tried the following $Regex

$Regex = '(?m)(^999.*\s+Gi1/10.*)
$Regex = '(?m)(^999.*\r\n\s+Gi1/10.*)

但是我使用的正则表达式都没有提取所有端口(3 行)

我也用过 get-content c:\config.txt -raw但这会显示配置文件中的所有内容。

如果有人可以帮助提取带有端口号的所有三行以及如何使用回车符和换行符来匹配新行,真的很感激。

最佳答案

Wiktor Stribiżew在对问题的评论中提供了关键指针[1]
: 您必须使用 Get-Content -Raw将文件内容读入单个字符串,以便您的正则表达式可以跨行匹配:

if ((Get-Content -Raw C:\Config.txt) -match '(?ms)^999.*?(?=\r?\n\S|\Z)') { 
$Matches[0] # automatic variable $Matches reflects what was captured
}

正则表达式也需要一些调整,包括使用非贪婪量词 .*? ,正如 TheMadTechnician 所建议的:
  • (?ms)设置正则表达式选项 m (将 ^$ 视为线 anchor )和 s (使 . 匹配 \n(换行符)也是`。
  • ^999.*?匹配任何以 999 开头的行以及非贪婪的任何后续字符。
  • (?=\r?\n\S|\Z)是一个正前瞻断言 ( (?=...) ) 匹配换行符 ( \r?\n ) 后跟一个非空白字符 ( \S ) - 假设是下一个块的开始 - 或 ( | ) ) 输入的最后 ( \Z ) - 实际上,这匹配文件的结尾或下一个块的开头,但不将其包含在记录在 $Matches 中的匹配中.


  • [1] Wiktor 还建议使用正则表达式 (?m)^999.*(?:\r?\n.*){2} ,它适用于样本输入,但仅限于恰好有 3 行的块 - 相比之下,此处提供的解决方案可以找到任意长度的块,只要非初始块行都具有前导空白即可。

    关于regex - 使用 Powershell 和 Regex 从文本文件中提取行 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49141781/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com