筛选数据段,包括起始行和结束行-PowerShell

筛选数据段,包括起始行和结束行-PowerShell,powershell,powershell-4.0,Powershell,Powershell 4.0,我有一个如下所示的文本文件: 我不需要的数据 更多无关紧要的数据 还有更多我不知道的数据 &开始/最后是我要查找的数据 &数据/我需要的更多数据 &停/我也需要这个 &开始/第二批我需要的数据 &数据/我也需要这个 &停/好了,我做完了 我不需要的结局 以下是输出需要的内容: File1.txt &开始/最后是我要查找的数据 &数据/我需要的更多数据 &停/我也需要这个 File2.txt &开始/我需要的第二批数据 &数据/我也需要这个 &停/好了,我做完了 我需要对文件夹中的每个文件执

我有一个如下所示的文本文件:

我不需要的数据
更多无关紧要的数据
还有更多我不知道的数据
&开始/最后是我要查找的数据
&数据/我需要的更多数据
&停/我也需要这个
&开始/第二批我需要的数据
&数据/我也需要这个
&停/好了,我做完了
我不需要的结局
以下是输出需要的内容:

File1.txt

&开始/最后是我要查找的数据
&数据/我需要的更多数据
&停/我也需要这个
File2.txt

&开始/我需要的第二批数据
&数据/我也需要这个
&停/好了,我做完了
我需要对文件夹中的每个文件执行此操作(有时会有多个文件需要过滤)。文件名可以递增:例如File1.txt、File2.txt、File3.txt

这是我尝试过的,但运气不佳:

ForEach对象{
$text-join“`n”-split'(?ms)(?=^&START)'-match'^&START'|
输出文件B:\PowerShell\$filename}

谢谢

看起来您非常接近:您的代码正确地提取了感兴趣的段落,但缺少对非起始行的段落内输出过滤,您需要写入特定于段落的输出文件:

$text -join "`n" -split '(?m)(?=^&Start)' -match '^&Start' | 
  ForEach-Object { $ndx=0 } { $_ -split '\n' -match '^&' | Out-File "File$((++$ndx)).txt" }
这将为每个感兴趣的段落创建以
File1.txt
开头的顺序编号文件


要对文件夹中的每个文件执行此操作,输出文件名在所有输入文件中使用固定命名方案
file
(以及累积编号),请执行以下操作:


要对文件夹中的每个文件执行此操作,输出文件名基于输入文件名和每个输入文件的编号(由于使用了
-PipelineVariable
),请执行以下操作:

像这样的

 $i=0
 gci -path "C:\temp\ExplodeDir" -file | %{ (get-content -path $_.FullName -Raw).Replace("`r`n`r`n", ";").Replace("`r`n", "~").Split(";") | %{if ($_ -like "*Start*") {$i++; ($_ -split "~") | out-file "C:\temp\ResultFile\File$i.txt" }} }

你发布了第二个问题(违反规则),它被删除了,但这里是我的快速答案。我希望它能帮助您,让您更加了解PS的工作原理:

$InputFile = "C:\temp\test\New folder (3)\File1.txt"

# get file content
$a=Get-Content $InputFile

# loop for every line in range 2 to last but one
for ($i=1; $i -lt ($a.count-1); $i++)
    {
    #geting string part between & and / , and construct output file name
    $OutFile = "$(Split-Path $InputFile)\$(($a[$i] -split '/')[0] -replace '&','').txt"

    $a[0]| Out-File $OutFile #creating output file and write first line in it
    $a[$i]| Out-File $OutFile -Append #write info line
    $a[-1]| Out-File $OutFile -Append #write last line
    }

我不知道在这个论坛上发布多个问题是违反规则的。对不起,提出听起来像“我有苹果,想要馅饼”的问题是违反规定的。您需要更详细地添加代码并提出更具体的问题,而不是一般性问题。上述代码可以工作,但不会输入文本文件的最后一行。若答案有帮助,请向上投票。第二个问题的语法是正确的-如何分割小文件。你也可以很容易地改变它为你工作。
 $i=0
 gci -path "C:\temp\ExplodeDir" -file | %{ (get-content -path $_.FullName -Raw).Replace("`r`n`r`n", ";").Replace("`r`n", "~").Split(";") | %{if ($_ -like "*Start*") {$i++; ($_ -split "~") | out-file "C:\temp\ResultFile\File$i.txt" }} }
$InputFile = "C:\temp\test\New folder (3)\File1.txt"

# get file content
$a=Get-Content $InputFile

# loop for every line in range 2 to last but one
for ($i=1; $i -lt ($a.count-1); $i++)
    {
    #geting string part between & and / , and construct output file name
    $OutFile = "$(Split-Path $InputFile)\$(($a[$i] -split '/')[0] -replace '&','').txt"

    $a[0]| Out-File $OutFile #creating output file and write first line in it
    $a[$i]| Out-File $OutFile -Append #write info line
    $a[-1]| Out-File $OutFile -Append #write last line
    }