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

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

Бла бла 123

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

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

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

Бла Бла 456

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

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

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

0
coinbird 31 Май 2019 в 02:16

2 ответа

Лучший ответ

Хорошо, другой ответ для другого подхода. Вы можете использовать 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
1
TheMadTechnician 4 Июн 2019 в 18:07

Если вы хотите полностью удалить строки, которые соответствуют определенным критериям, я бы использовал оператор -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
3
TheMadTechnician 31 Май 2019 в 00:14
56386805