我在尝试使用多线正则表达方式时,实际上是在挫败感,我对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)但老实说,如果它更容易,我将采用整个块。 任何帮助将不胜感激。
答案 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
}