Замена символов в середине строки в текстовом файле с помощью PowerShell

#powershell #file #replace

#powershell #файл #заменить

Вопрос:

Ниже приведен код, который я использую для замены строки в текстовом файле, и он работает. Однако; Я столкнулся с проблемой, когда строка, которую я хочу заменить, не всегда в точности совпадает, но первые несколько символов совпадают. Я хочу найти первые несколько символов, посчитать на 3 символа вперед и заменить их на то, что я хочу.

Например, строка, которую я заменяю, может быть 123xxx , или 123aaa и т.д. Но значение, на которое я ее заменяю, всегда будет известно. Как я буду заменять 123xxx , когда я не всегда буду знать, что такое xxx ?

 ((Get-Content -path $ConfPath -Raw) -replace $OldVersion,$NewVersion) | Set-Content -Path $ConfPath
  

Комментарии:

1. Параметр -replace принимает регулярное выражение, вы могли бы написать шаблон для этого. Если вы хотите, я предоставлю вам ответ с решением.

2. Стив, добро пожаловать в SO. Вы должны предоставить лучший пример. Возможно, несколько примеров полных строк, что вы хотите удалить, и ожидаемый результат. Это помогло бы всем оказывать вам лучшую помощь.

3. $string -replace '123...',$newvalue

4. Немного запутанно объяснять, но я попытаюсь. Строка в файле, которую я хочу заменить, будет «jre1.8.0_251», но я не всегда буду знать, какие 3 цифры в конце. это может быть любое число 3. Я хочу заменить его на «jre1.8.0_261», который, я знаю, всегда будет одним и тем же. Мой вопрос в том, как сказать, что я хочу заменить «jre1.8.0_251», не зная последних 3 цифр. Я смотрю на регулярное выражение, но на самом деле не понимаю его прямо сейчас. Я предполагаю, что я не нашел достаточно хорошей статьи, которая объясняет это мне.

5. Итак, в основном я хочу заменить «jre1.8.0_» плюс 3 символа на «jre1.8.0_261». Эта строка находится в файле, который содержит много текста, но эта строка находится только в одном месте файла и в конце строки, в которой она находится, поэтому сразу после 3 символов, я думаю, будет символ новой строки.

Ответ №1:

Поскольку -replace используется регулярное выражение, вам нужно экранировать символы, которые имеют особое значение, например, в вашем случае точку (любой символ в регулярном выражении).

 $OldVersion = 'jre1.8.0_d{3}'  # backslash escape the dots.  d{3} means 3 digits
$NewVersion = 'jre1.8.0_261'      # this is just a string to replace with; not regex
((Get-Content -path $ConfPath -Raw) -replace $OldVersion,$NewVersion) | Set-Content -Path $ConfPath
  

Ответ №2:

Я исследовал это и выяснил с помощью regex. Приведенный ниже код делает именно то, что я хотел сделать:

 ((Get-Content -path $ConfPath -Raw) -replace 'jre1.8.0_...',$NewVersion) | Set-Content -Path $ConfPath