Powershell - заменить строку в .txt, если условие выполнено - PullRequest
0 голосов
/ 19 июня 2020

Я новичок в написании сценариев (несколько недель) и буду рад вашей помощи. У меня есть файл журнала (.txt), который необходимо изменить.

Содержимое всегда одно и то же:

    random text
    random text
    successfull
    error

    random text
    random text
    random text
    error

    ...

Я бы хотел удалить строку, содержащую слово " 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 голосов
/ 19 июня 2020

Вы можете использовать некоторые условные логические c (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 строк просто не отображается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...