Powershell v2. Удаление или удаление строк текста. Проблема с Regex

Вопрос: Сегодня я прошел через столько сообщений, которые предлагают примеры Powershell о том, как удалить целые строки из файла, используя номера строк. К сожалению, ни один из них не делает то, что мне нужно, или у них есть некоторые "но" классовые предложения. Самый близкий пример, который я нашел, использует метод -remove. Это удалось выполнить эту

Вопрос:

Сегодня я прошел через столько сообщений, которые предлагают примеры Powershell о том, как удалить целые строки из файла, используя номера строк. К сожалению, ни один из них не делает то, что мне нужно, или у них есть некоторые “но” классовые предложения.

Самый близкий пример, который я нашел, использует метод -remove. Это удалось выполнить эту работу, пока я не заметил, что не все строки, которые я пытался удалить, были удалены. После нескольких исследований я обнаружил, что -remove зависит от Regex, и Regex не любит некоторых специальных символов, которые случаются в некоторых строках, которые я хочу удалить/удалить.

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

Function DeleteLineFromFile ($Path, $File, $LineNumber){ $Contents = Get-Content $Path$File $Contents -replace $Contents[$LineNumber -1],»» | Set-Content $Path$File }

Отличный пример, который я считаю. Только регулярное выражение не будет работать со специальными символами.

Целью является следующее: Сделать функцию, которая не заботится о том, что находится в строке. Я не буду кормить его дорогой, файлом и строкой, тогда функция удалит эту строку и сохранит файл.

Ответ №1

Это довольно просто и не требует регулярного выражения.

Прочтите файл:

$lines = Get-Content $Path$File

Затем мы имеем массив, содержащий строки в файле. Когда у нас есть массив, мы можем использовать индексы для получения элементов из массива, например

$ линии [4]

будет пятой строкой. Вы также можете передать массив в индекс, чтобы получить несколько строк:

$lines[0,1,5] # returns the first, second and 6th line $lines[0..5] # returns the first 6 lines

Мы можем использовать это с небольшим трюком. Операторы сравнения PowerShell, например -eq работают по-разному с массивом с левой стороны, поскольку они не возвращают $true или $false, а скорее все элементы из массива, сравнивающие сравнение:

1..5 -ge 3 # returns 3,4,5 0..8 -ne 7 # returns 0 through 8, *except* 7

Вероятно, вы можете увидеть, где это происходит…

$filteredLines = $lines[0..($lines.Length-1) -ne $LineNumber — 1]

Технически вы можете игнорировать — 1 после $lines.Length потому что индексирование вне массива просто ничего не делает. Тем не менее, это действительно удаляет строку, которую вы хотите удалить. Если вы просто хотите, чтобы его заменили пустой строкой (что, кажется, делает ваш код, но это не похоже на то, что вы хотите), тогда этот подход не будет работать.

Существуют и другие варианты, например, с помощью ForEach-Object:

Get-Content $Path$File | ForEach-Object { $n = 1 } { if ($n -ne $LineNumber) { $_ } else { » } }

Слово совета по написанию функций: Обычно у вас нет отдельных параметров $Path и $File. Они не служат никакой реальной цели. Каждый командлет использует только параметр $Path который указывает на файл, если это необходимо. Если вам нужна папка, в которой находится файл, вы всегда можете использовать Split-Path -Parent $Path для ее получения.

Оцените статью
Добавить комментарий