Найти и заменить в PowerShell

Мой сценарий PowerShell читает большой текстовый файл и выполняет с ним кучу действий. Часть, на которой я застрял, - это то, как редактировать всю строку текста на основе ее части.

Например, эта строка находится в моем текстовом файле:

Blah Blah 123

Я бы использовал этот PowerShell:

$FileContents=$FileContents.Replace("Blah Blah 123","Whatever")

Моя проблема в том, что часть «123» может отличаться от строки к строке, но мне все равно нужно удалить всю строку. Поэтому мне все еще нужно удалить эту строку:

Blah Blah 456

Но мой PowerShell этого не увидит.

Я могу указать только на часть «бла-бла», но тогда он заменяет только эту часть, оставляя позади «456».

Есть ли у PowerShell способ справиться с этим? Я думал о том, чтобы получить местоположение символа (например, массив?) первого символа строки, а затем получить оттуда подстроку до нового символа строки. Но я не уверен, что это вообще возможно...

Используйте -replace, он поддерживает регулярное выражение. cat text.file | %{$_ -ireplace "blah blah .*", "whatever"}

Larry Song 31.05.2019 01:27

@LarrySong Что это за штука: «cat text.file | %» и заставляет ли использование $_ работать как цикл foreach? Извините, я новичок в PowerShell, и это похоже на множество движущихся частей!

coinbird 31.05.2019 01:50
cat — это псевдоним для Get-Content, %{ ... } — это псевдоним для цикла ForEach-Object{ ... }. $_ внутри цикла относится к текущему элементу цикла. Поэтому он предложил вам прочитать файл, а затем передать его в цикл по одной строке за раз, и в этом цикле $_ представляет текущую строку.
TheMadTechnician 31.05.2019 02:00
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
855
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите полностью удалить строки, соответствующие определенным критериям, я бы использовал оператор -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

Проверяем это сейчас! Отчитаюсь, когда заработаю :)

coinbird 31.05.2019 15:21

Похоже, это решение не подойдет для моей ситуации, так как текст, с которым я работаю, не содержится в массиве. Он удаляет весь текст, оставляя пустую переменную. К сожалению, остальная часть моего кода основана на манипулировании огромной строкой (~ 1 миллион строк текста), поэтому постоянное преобразование ее в массив невозможно :(

coinbird 04.06.2019 16:33
Ответ принят как подходящий

Хорошо, другой ответ для другого подхода. Вы можете использовать замену 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

Выглядит отлично. Спасибо за помощь!

coinbird 04.06.2019 20:32

Другие вопросы по теме