gpt4 book ai didi

regex - Powershell正则表达式以匹配特定的文本顺序,并且仅将它们包括在结果中

转载 作者:行者123 更新时间:2023-12-03 00:12:05 25 4
gpt4 key购买 nike

我正在尝试在Select-String Commandlet中查找powershell的工作正则表达式,以查找标记为外观文本开始的特定文本,并从这一点开始查找其他特定文本,直到找到最后一个文本。

带有文本的文件示例:

[Begin Of_Header]
Some.Text="Text"
Some.Text="Text"
Serial=0X94PA
Some.Text="Text"
Some.Text="Text"
Timer=0
Some.Text="Text"
Some.Text="Text"
Tag.SM=00
Some.Text="Text"
Some.Text="Text"
Some.Text="Text"
Some.Text="Text"
Tag.OM=00
Some.Text="Text"
Some.Text="Text"
Some.Text="Text"
Tag.UC=00
Some.Text="Text"
Some.Text="Text"
Some.Text="Text"
Events=pd_exf1
Some.Text="Text"
Some.Text="Text"
Some.Text="Text"
Acp="My looking dynamic text"
Some.Text="Text"
Some.Text="Text"
Dir=6
Some.Text="Text"
Some.Text="Text"
WG=100
Some.Text="Text"
Some.Text="Text"
H=95.5
Some.Text="Text"
Some.Text="Text"

[Begin Of_Header]
Serial=0XZZZ
Timer=0
Some.Text="Text"
Some.Text="Text"
Tag.OM=00
Tag.UC=00
Some.Text="Text"
Some.Text="Text"
Events=pd_exf1
Acp="My looking dynamic text"
Dir=6
WG=100
H=95.5


[Begin Of_Header]
Serial=0XPPPP
Timer=0
Tag.SM=00
Some.Text="Text"
Some.Text="Text"
Tag.OM=00
Tag.UC=00
Some.Text="Text"
Some.Text="Text"
Events=pd_exf1
Acp="My looking dynamic text"
Dir=6
WG=100
H=95.5

在这种情况下,它应该寻找静态单词 [Begin Of_Header] ,从这一点开始,动态值的精确顺序匹配以 Serial = 开头,并以 结尾Acp =“我的动态文本” 。并且Acp =可以具有各种值+串行。如果缺少值,例如 Tag.SM = 00缺少,则跳过此组中的搜索并跳转到下一个 [Begin Of_Header] ,然后再次开始分析。

结果应该是这样的:
[Begin Of_Header]
Serial=0X94PA
Timer=0
Tag.SM=00
Tag.OM=00
Tag.UC=00
Events=pd_exf1
Acp="My looking dynamic text"

[Begin Of_Header]
Serial=0XPPPP
Timer=0
Tag.SM=00
Tag.OM=00
Tag.UC=00
Events=pd_exf1
Acp="My looking dynamic text"

我发现了类似 here的东西,但是不能完全按照我的要求工作。

同样,这不能按预期方式工作,因为它不排除完全匹配顺序中断的情况:
Select-String -LiteralPath "C:\myfile.txt" -Pattern "\[Begin Of_Header\]|Serial=|Timer=|Tag.SM=|Tag.OM=|Tag.UC=|Events=|Acp=" | Select-Object LineNumber,Line

最佳答案

正则表达式很复杂,但是由于元素的顺序是固定的,所以我认为没有问题。

$Header = '[Begin Of_Header]'
$RE = [RegEx]'(?smi)(^Serial=.*?$).*(^Timer=.+?$).*(^Tag\.SM=.+?$).*(^Tag\.OM=.+?$).*(^Tag\.UC=.+?$).*(^Events=.+?$).*(^Acp=.+?$)'

(Get-Content .\myfile.txt -raw) -split [RegEx]::Escape($Header)|
Select-String $RE | ForEach-Object{
$Header
for($i=1;$i -lt 8;$i++){$_.matches.groups[$i].value}
""
}

样本输出:
> Q:\Test\2017\09\10\SO_46139332.ps1
[Begin Of_Header]
Serial=0X94PA
Timer=0
Tag.SM=00
Tag.OM=00
Tag.UC=00
Events=pd_exf1
Acp="My looking dynamic text"

[Begin Of_Header]
Serial=0XPPPP
Timer=0
Tag.SM=00
Tag.OM=00
Tag.UC=00
Events=pd_exf1
Acp="My looking dynamic text"

  • header 用于将文件内容拆分为多个块,以分别与RE匹配
  • (?smi)建议RE使用
  • s修饰符:单行。点与换行符
  • 匹配
  • m修饰符:多行。使^和$匹配每行的开始/结束(不仅是字符串的开始/结束)
  • 我修改器:不敏感。不区分大小写的匹配
  • (^Serial=.*?$).*
  • 第一捕获组(^ Serial =。*?$)
    ^声明行首的位置
    Serial =从字面上匹配字符Serial =(不区分大小写)
    。*?
    。匹配任何字符
    *?量词-匹配零到无限次,次数尽可能少,根据需要扩展(延迟)
    $在行尾声明位置
    。*
    匹配任何字符
    *量词-尽可能在零到无限次之间进行匹配,并根据需要返回(贪婪)
  • 关于regex - Powershell正则表达式以匹配特定的文本顺序,并且仅将它们包括在结果中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46139332/

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