使用正则表达式选择字符串并拆分/输出到多个文件



大家好

想就我在选择字符串/正则表达式上做错了什么寻求建议。 当在记事本++上测试具有'(?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( 以匹配nr字符。由于同一正则表达式模式有多个匹配项,因此需要添加-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 ---

相关内容

  • 没有找到相关文章

最新更新