Powershell 删除匹配文本上方的行

Powershell delete lines above matched text

谁能帮我找到一种简单的方法来查找文本文件中的字符串,然后使用 powershell 删除匹配文本上方的 10 行?

例如,我有一个沿着这些行的文本文件(我想找到多个类似文本的实例):

=============start============
random text
random text
random text
random text
random text
string I want to find
=============end============
=============start============
random text
random text
random text
=============end============
=============start============
random text
random text
random text
=============end============
=============start============
random text
random text
random text
=============end============
=============start============
random text
random text
random text
=============end============

所以在这个例子中,我想搜索 "String I want to find" 的每个实例,当找到时删除匹配文本上方的 X 行,将其余部分输出到另一个 .txt 文件。上面的行数总是相同的。

我试过如下匹配两个字符串之间的文本:

(Get-Content -LiteralPath $Path\processing\data.txt) -replace     '$matchstart*$matchend','' |out-file $Path\processing\test.txt

然而,这似乎并没有给我我希望的输出(没有删除任何东西)。

这也有效,但可能会导致问题,因为起始字符串经常出现多次,可能导致我删除的内容超出我的意愿。

$str = Get-Content $Path\processing\pfxdetailpre.txt | out-string
$start = $str.indexOf($nokeystart) + 1
$end = $str.indexOf($nokeyend, $start)
$length = $end - $start
$result = $str.substring($start, $length)

以下似乎很适合删除我的字符串和之前的行。不过,我不知道如何编辑它以删除上面的 X 行。

gc $file | %{
$a=$b=$null
}{
if($a){$a}
$a=$b
$b=$_
if($b -match $key){$a=$b=$null}
}{
if($b -notmatch $key){
if($a){if($b){"$a`n$b"}else{$a}}elseif($b){$b}
}
} | out-file $newfile

好的,所以根据 LotPings 的建议,我有以下适合我的代码。我无法让它与 '$matchstart.*$matchend 一起工作,所以我只使用了无论如何都不会改变的原始值:

所以,我的文件看起来像这样。我知道 start/end 是什么样子,但我只想删除它,如果它包含某个字符串:

=============start============
random text
random text
random text
string I want to find
random text
random text
=============end============
=============start============
random text
random text
random text
=============end============
=============start============
random text
random text
random text
=============end============
=============start============
random text
random text
random text
=============end============
=============start============
random text
random text
random text
=============end============

我发现下面的代码很好用!

$file = Get-Content C:\test1.txt -Raw
$result = $file | Select-String -Pattern '(?smi)(=============start============\s+string I want to find.*?=============end============)'
$result.Matches.Value | Out-File -FilePath C:\processing.txt
$file -replace '(?smi)(=============start============\s+string I want to find.*?=============end============)' | Out-File -FilePath C:\configfinal.txt

我仍然很想听听其他人会如何处理这个问题。我对 powershell 很陌生,因为我只学了几个星期,这是我自己无法轻松解决的第一个任务。