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