Powershell-如果满足条件,请替换.txt中的行

时间:2020-06-19 14:52:33

标签: powershell

我刚开始编写脚本(几个星期),很高兴为您提供帮助。 我有一个日志文件(.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"

非常感谢您的帮助。

1 个答案:

答案 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行。