Найти и заменить в PowerShell - PullRequest
0 голосов
/ 31 мая 2019

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

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

Бла Бла 123

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

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

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

Бла Бла 456

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

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

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

Ответы [ 2 ]

3 голосов
/ 31 мая 2019

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

Хорошо, другой ответ для другого подхода. Вы можете использовать RegEx replace для замены любой заданной строки в многострочной строке на основе соответствующего текста в этой строке. Мы будем использовать взгляд назад, чтобы найти либо начало строки, либо разрыв строки, затем любой текст вплоть до искомой строки, которую мы ищем, и любые дополнительные символы, включая следующий разрыв строки, и если этот шаблон найден это просто заменяет это ничем. Я создам здесь-строку для имитации многострочной строки, такой как ввод вашего файла, который включает ключевую фразу в первой строке, строку в середине и последнюю строку, просто чтобы показать, что она работает в любой строке. Затем замена, которая фактически удаляет текст.

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...