Мой скрипт PowerShell читает большой текстовый файл и делает с ним кучу всего. Часть, на которой я застрял, состоит в том, как редактировать целую строку текста, основываясь на ее части.
Например, эта строка находится в моем текстовом файле:
Бла бла 123
Я бы использовал эту PowerShell:
$FileContents=$FileContents.Replace("Blah Blah 123","Whatever")
Моя проблема в том, что часть «123» может отличаться от строки к строке, но мне все равно нужно удалить всю строку. Поэтому мне все еще нужно удалить эту строку:
Бла Бла 456
Но моя PowerShell не увидит этого.
Я могу указать только на часть «Бла-бла», но тогда она только заменит эту часть, оставив «456» позади.
Есть ли у PowerShell способ справиться с этим? Я думал о том, чтобы получить положение символа (например, массив?) Первого символа строки, а затем получить подстроку от нее до символа новой строки. Но я не уверен, что это даже возможно ...
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
Если вы хотите полностью удалить строки, которые соответствуют определенным критериям, я бы использовал оператор -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
Похожие вопросы
Новые вопросы
arrays
Массив - это упорядоченная линейная структура данных, состоящая из набора элементов (значений, переменных или ссылок), каждый из которых идентифицируется одним или несколькими индексами. Когда вы спрашиваете о конкретных вариантах массивов, используйте вместо них следующие связанные теги: [vector], [arraylist], [matrix]. При использовании этого тега в вопросе, относящемся к языку программирования, пометьте вопрос используемым языком программирования.