powershell多线正则表达式块

时间:2016-10-24 18:15:22

标签: regex powershell multiline

我在尝试使用多线正则表达方式时,实际上是在挫败感,我对Powershell的经验很少,虽然我尝试过的例子,但是一旦我开始根据需要调整它们它从未给出任何结果。

我的文本文件示例

CLO*5000000Z115240057*598.50***94>0
DGP*115*G8*20161024~
DGP*096*G8*20161024~
DI*ABC>121~
QM1*BN*1*~
QM2*H2*1*~
QM1397*2*~
Q3*~
Q4*~
TX*1~
SQU*HV>01480>AB>1S>1>2>3>4~
0T1*472*D8*20160915~
RBF*6R*374196~
TX*2~

在同一文本文件中可能有200个(最多)。我正在搜索以'SQU'开头的行,最后包含1> 2> 3> 4,只有少数可以做到。我能够使用下面找到的代码示例找到所有SQU行,不幸的是我还需要获得'CLO'行,它就在它上面。

$fpath = 'C:\myfile.txt'
$opath = 'C:\logoutput.txt'
$regx = 'SQU.*1>2>3>4.*'
Get-Content $fpath | % { if($_ -match $regx) {add-content $opath $_}}

我已经尝试过了,我已经尝试了几十个$和s和()以及我想到的每一个组合。我真的不明白如何将它放入logoutput.txt。

$fileContent = [io.file]::ReadAllText($fpath)
$filecontent | Select-String '(?ms)CLO.*SQU.*1>2>3>4.*' -AllMatches | %{ $_.Matches } | %{ $_.Value } 

这个我试过没有> 1> 2> 3> 4只是为了看看我能得到什么,但没有运气。

$stringmatch = Get-Content -raw $fpath
if (Select-String -inputobject $stringmatch -pattern '(?smi)CLO.*SQU.*'){
$matches[1]
} 

我只需要CLO和SQU线(如果它有1> 2> 3> 4)但老实说,如果它更容易,我将采用整个块。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

在第二个示例中 - 您阅读文本文件,然后匹配正则表达式,然后打印出值。该值将显示匹配的全部内容,其中包括CLO和SQU之间的所有.*。而是在您关心的行上使用组捕获(使用parens),然后仅打印组'值。

另外 - 修改正则表达式以使用非贪婪匹配,这样多个匹配就能正常工作。 对正则表达式的另一个修改是你不希望在CLO和SQU组的行尾之后匹配字符 - 所以确保这些匹配以行$指示符的结尾结束。

$fileContent = [io.file]::ReadAllText($fpath)
$filecontent | Select-String '(?ms)(CLO[^\n]*?$).*?(SQU.*?1>2>3>4[^\n]*$)' -AllMatches | %{ $_.Matches } | %{ $_.Groups[1].Value; $_.Groups[2].Value }

答案 1 :(得分:0)

$fileContent = [io.file]::ReadAllText($fpath)

# Match lines beginning with CLO, and lines beginning with SQU
$m = [regex]::Matches($fileContent,
                      '(?<clo>^CLO.*?$).*?(?<squ>^SQU.*?$)',
                      [System.Text.RegularExpressions.RegexOptions]('Multiline', 'Singleline')) 

# Filter out only the pairs where the SQU lines also have the right ending
$m | Where-Object { $_.Groups['squ'].Value -match "1>2>3>4~" } | 
     ForEach-Object { 
        $_.Groups['clo'].Value
        $_.Groups['squ'].Value
}