Мой сценарий PowerShell читает большой текстовый файл и выполняет с ним кучу действий. Часть, на которой я застрял, - это то, как редактировать всю строку текста на основе ее части.
Например, эта строка находится в моем текстовом файле:
Blah Blah 123
Я бы использовал этот PowerShell:
$FileContents=$FileContents.Replace("Blah Blah 123","Whatever")
Моя проблема в том, что часть «123» может отличаться от строки к строке, но мне все равно нужно удалить всю строку. Поэтому мне все еще нужно удалить эту строку:
Blah Blah 456
Но мой PowerShell этого не увидит.
Я могу указать только на часть «бла-бла», но тогда он заменяет только эту часть, оставляя позади «456».
Есть ли у PowerShell способ справиться с этим? Я думал о том, чтобы получить местоположение символа (например, массив?) первого символа строки, а затем получить оттуда подстроку до нового символа строки. Но я не уверен, что это вообще возможно...
@LarrySong Что это за штука: «cat text.file | %» и заставляет ли использование $_ работать как цикл foreach? Извините, я новичок в PowerShell, и это похоже на множество движущихся частей!
cat
— это псевдоним для Get-Content
, %{ ... }
— это псевдоним для цикла ForEach-Object{ ... }
. $_
внутри цикла относится к текущему элементу цикла. Поэтому он предложил вам прочитать файл, а затем передать его в цикл по одной строке за раз, и в этом цикле $_
представляет текущую строку.
Если вы хотите полностью удалить строки, соответствующие определенным критериям, я бы использовал оператор -notmatch
внутри оператора Where{}
. Например:
$MyArray = 'Dogs make great pets','Cats make great pets','Chupacabra make great pets','Hamsters make great pets'
$Pets = $MyArray | Where{ $_ -notmatch 'Chupacabra' }
На данный момент $Pets
содержит строки:
Dogs make great pets
Cats make great pets
Hamsters make great pets
Проверяем это сейчас! Отчитаюсь, когда заработаю :)
Похоже, это решение не подойдет для моей ситуации, так как текст, с которым я работаю, не содержится в массиве. Он удаляет весь текст, оставляя пустую переменную. К сожалению, остальная часть моего кода основана на манипулировании огромной строкой (~ 1 миллион строк текста), поэтому постоянное преобразование ее в массив невозможно :(
Хорошо, другой ответ для другого подхода. Вы можете использовать замену RegEx для замены любой заданной строки в многострочной строке на основе совпадающего текста в этой строке. Мы будем использовать просмотр назад, чтобы найти либо начало строки, либо разрыв строки, затем любой текст до нужной строки, которую мы ищем, и любые дополнительные символы, включая следующий разрыв строки, и если этот шаблон найден он просто заменяет его ничем. Я создам здесь-строку для имитации многострочной строки, такой как ввод вашего файла, которая включает ключевую фразу в первой строке, строку в середине и последнюю строку, просто чтобы показать, что это работает на любой строке. Затем замена, которая фактически удаляет текст.
# Simulate reading a file as a multi-line string (Get-Content -Raw)
$MyArray = @'
Some Chupacabra make great pets
Some Dogs make great pets
Some Cats make great pets
Some Chupacabra make great pets
Some Hamsters make great pets
Some Chupacabra make great pets
'@
# This line will remove any line that has 'Chupracabra' anywhere in the line
$MyArray -replace '(?m)(?<=^|[\r\n]).*?Chupacabra.*?(?:[\r\n]|$)+'
Это произведет:
Some Dogs make great pets
Some Cats make great pets
Some Hamsters make great pets
Выглядит отлично. Спасибо за помощь!
Используйте
-replace
, он поддерживает регулярное выражение.cat text.file | %{$_ -ireplace "blah blah .*", "whatever"}