#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