大家好
想就我在选择字符串/正则表达式上做错了什么寻求建议。 当在记事本++上测试具有'(?m)(abc)(.*?)(--- End ---)'
模式的正则表达式时,它可以工作(字段正确突出显示(,但是当我将其放入Powershell中执行时,它会返回空结果。
如果我将正则表达式更改为'(?m)(abc)(.*?)'
,它将获取从第 1 行到第 12 行的全部内容。
我想捕获并能够将结果拆分为 3 个结果文件 文件 1 -(从第 1 行到第 4 行的内容( 文件 2 - (内容行 5 到第 8 行( 文件 3 - (内容行 9 到第 12 行
Broken Command that i used:
While (line is not equal to end of file) {
Get-ChildItem "C:UsersASUSDesktopPscripttest-script.txt" | ForEach {
$getctnt = Get-Content $_.FullName
$getctnt | Select-String -Pattern '(?m)(abc)(.*?)(--- End ---)' | Out-File .result$a.txt
$a++
}
}
Content of the Test-script.txt:
Line1 abc
Line2 content1
Line3 conten2
Line4 --- End ---
Line5 abc
Line6 content1
Line7 content2
Line8 --- End ---
Line9 abc
Line10 content1
Line11 content2
Line12 --- End ---
您的尝试问题源于未正确阅读Test-script.txt
。在没有-Raw
开关的情况下运行命令Get-Content
时,文件将作为字符串数组读入。当它被传送到Select-String
时,该命令一次只处理一行,并且对上一行或下一行一无所知。如果实现-Raw
开关,它将作为一个字符串在文件中读取。然后,您可以管道进入Select-String
并能够匹配换行符。话虽如此,您需要为.
启用单行修饰符 (?s
( 以匹配n
和r
字符。由于同一正则表达式模式有多个匹配项,因此需要添加-AllMatches
开关。
$getctnt = Get-Content $_.FullName -Raw
$selections = $getctnt | Select-String -Pattern '(?s)(abc)(.*?)(--- End ---)' -AllMatches
$selections
现在将包含一个MatchInfo
对象的数组,您可以根据需要迭代或索引这些对象。以下是访问这些值的方法。
$selections.Matches # For the MatchInfo objects
$selections.Matches.Value # For the matched values
由于使用了多个括号集,因此已创建 4 个捕获组 (0,1,2,3( 和 3 个匹配项。我不知道这是否是你的意图,但它们也是可访问的。要轻松访问它们,您可以迭代 3 个MatchInfo
对象(总共三个匹配项(。
$selections.Matches | Foreach-Object {
$_.Groups[0] # Each full regex match
$_.Groups[1] # Capture group 1: (abc)
$_.Groups[2] # Capture group 2: (.*?)
$_.Groups[3] # Capture group 3: (--- End ---)
}
我猜也许,
(?i)[sS]*?(?:.*---s*ends*---s*)
或
(?i)[sS]*?.*---s*ends*---s*
也许可以调查一下。
如果您希望简化/修改/探索表达式,已在 regex101.com 的右上角面板上进行了说明。如果您愿意,还可以在此链接中观看它如何与一些示例输入匹配。
如果您只想将文件分解为 4 行块的数组,那么这将完成这项工作。 它使用Get-Content
的-ReadCount
参数来读取行组中的文件。
这假设您的块始终是 4 行,tho。[咧嘴一笑]
@'
abc
content_1
content_1b
--- End ---
def
content_2
content_2b
--- End ---
ghi
content_3
content_3b
--- End ---
'@ | Set-Content 'C:TempStevL.txt'
$InStuff = Get-Content -LiteralPath C:TempStevL.txt -ReadCount 4
$InStuff[0]
输出。。。
abc
content_1
content_1b
--- End ---