我刚开始编写脚本(几个星期),很高兴为您提供帮助。 我有一个日志文件(.txt),需要更改。
内容始终相同:
random text
random text
successfull
error
random text
random text
random text
error
...
我想删除包含“错误”一词的行,但前提是上面的行包含“成功”一词。
到目前为止,我设法从文件中取出所有匹配的字符串并能够替换它们,但是在此过程中我丢失了其余文本:
get-content "D:\test.txt" | select-string -pattern "error" -context 1,0 | Where-Object {"$_" -match "successfull" } | %{$_ -replace "error.*"} | Out-File "D:\result.txt"
非常感谢您的帮助。
答案 0 :(得分:0)
您可以使用一些条件逻辑(if
语句)来实现目标:
$successful = $false
Get-Content d:\test.txt | Foreach-Object {
if ($_ -match "successfull") {
$successful = $true
$_
}
elseif ($_ -match "error" -and $successful) {
$successful = $false
}
else {
$_
$successful = $false
}
}
由于我们将Get-Content
的结果传递到Foreach-Object
中,因此$_
成为当前正在处理的行(每一行都被逐行处理)。如果一行包含successfull
,则我们将$successful
标记为$true
并仍输出该行($_
)。如果该行包含error
,则仅当$successful
为$false
时才输出。每当我们到达不包含succcesfull
的行时,就会将$successful
标记为$false
。
实际上没有发生删除,因为在满足条件时它仅不显示error
行。