Назад | Перейти на главную страницу

Удаление строк из текстового файла с помощью Powershell

Я пытаюсь удалить определенные строки из текстового файла. Текстовый файл - это просто список, и я хочу удалить определенные записи, если они есть. Итак, что у меня есть:

$f=${path_to_file}
for($i = 0; $i -le $f.length; $i++)
{
    if ($f[$i] -eq "text_to_be_deleted")
    {
        $f[$i]=$null
    }
}
${path_to_file}=$f

Проблема в том, что это удаляет все символы возврата каретки из текстового файла. Я пробовал следующее:

(type path_to_file) -notmatch "text_to_be_deleted" | out-file path_to_file

Проблема с этой командой в том, что у меня может быть строка, такая как «abc», «abcd» или «abcde». Если у меня в кавычках стоит «abc», он удаляет любую строку, содержащую «abc», а не только точное совпадение. Я действительно плохо разбираюсь в регулярных выражениях, поэтому я не мог понять, как указать именно эту строку.

Есть предложения, как это сделать?

Это можно сделать с помощью однострочника:

(type path_to_file) -notmatch "^text to be deleted$" | out-file path_to_file

Обратите внимание, что ^ означает "начало строки", а $ означает конец строки.

Если вы не против использования инструментов, отличных от PowerShell:

findstr /V /C:"abcd" file.txt > file_new.txt

У тебя есть большая часть.

$f=${path_to_file}
for($i = 0; $i -le $f.length; $i++)
{
    ## If NOT EQUAL to text-to-be-deleted, print to file
    if ($f[$i] -ne "text_to_be_deleted")
    {
        ## write to file, preserving carriage returns.
        out-file -filepath ${path_to_file} -InputObject $f[$i] -append
    }
}

Он использует out-file иначе, чем вы, но должен сохранять CR.