В PowerShell [Core] (v6.1 +) возможно краткое решение:
$file = 'somefile.txt'
(Get-Content -Raw $file) -replace '(?m)(?<=^\s+version: ).+(?=;$)', {
# Increment the *last numeric* component of the version number.
# See below for how to target other components.
$_.Value -replace '(?<=\.)\d+(?=$|-)', { 1 + $_.Value }
} | Set-Content $file
Примечание:
* В PowerShell [Core] 6+, кодировка UTF-8 без спецификации является кодировкой по умолчанию; используйте -Encoding
с Set-Content
, если вам нужна другая кодировка.
* Используя -Raw
, команда сначала считывает весь файл в память, что позволяет выполнить запись в тот же файл в том же конвейере; однако существует небольшой риск потери данных в случае прерывания обратной записи во входной файл.
* -replace
неизменно заменяет все подстроки, соответствующие регулярному выражению.
* Параметр встроенного регулярного выражения (?m)
гарантирует, что ^
и $
соответствуют началу и концу отдельных строк , что необходимо из-за того, что Get-Content -Raw
читает весь файл как одну многострочную строку.
Примечание:
Для простоты текстовое манипулирование строкой версии выполняется , но Вы также можете преобразовать $_.Value
в [version]
или [semver]
(только PowerShell [Core] v6 +) и работать с этим.
Преимущество текстовых манипуляций заключается в краткой способности сохранять все другие компоненты входная строка версии, как есть, без добавления ранее неуказанных.
Вышеприведенное опирается на способность -replace
оператора выполнять подстановку строк на основе регулярных выражений полностью динамически, через блок скриптов ({ ... }
) - как объяснено в этом ответе .
Регулярные выражения используют look - круглые утверждения ((?<=...)
и (?=...)
), чтобы обеспечить соответствие только части изменяемого входа.
- Только
(?<=^\s+version: )
и (?=;$)
Обозначения указаны c для формата файла примера; отрегулируйте эти части так, чтобы они соответствовали номеру версии в формате вашего файла.
Приведенный выше прирост составляет компонент последней цифры входной версии c. Чтобы нацелился на различные компоненты номера версии , используйте вместо этого следующее внутреннее регулярное выражение:
Увеличьте major number (например, 2.0.9
-> 3.0.9
):
'2.0.9' -replace '\d+(?=\..+)', { 1 + [int] $_.Value }
несовершеннолетний число :
'2.0.9' -replace '(?<=^\d+\.)\d+(?=.*)', { 1 + [int] $_.Value }
Патч / сборка число (3-й компонент; 2.0.9
-> 2.0.10
):
'2.0.9' -replace '(?<=^\d+\.\d+\.)\d+(?=.*)', { 1 + [int] $_.Value }
последний / ревизия номер , как указано выше, независимо от того, что это такое, даже если за ним следует метка предварительного выпуска (например ,; 2.0.9.10
-> 2.0.9.11
или 7.0.0-preview2
-> 7.0.1-preview2
):
'2.0.9.10' -replace '(?<=\.)\d+(?=$|-)', { 1 + [int] $_.Value }
Примечание. Если целевой компонент не существует, исходный версия возвращается как есть.
В Windows PowerShell , где -replace
не поддерживает замены на основе блоков сценариев, вы можете использовать switch
оператор с -File
и -Regex
варианты вместо:
$file = 'someFile.txt'
$updatedFileContent =
switch -regex -file $file { # Loop over all lines in the file.
'^\s+version: (.+);$' { # line with version number
# Extract the old version number...
$oldVersion = $Matches[1]
# ... and update it, by incrementing the last component in this
# example.
$components = $oldVersion -split '\.'
$components[-1] = 1 + $components[-1]
$newVersion = $components -join '.'
# Replace the old version with the new version in the line
# and output the modified line.
$_.Replace($oldVersion, $newVersion)
}
default { # All other lines.
# Pass them through.
$_
}
}
# Save back to file. Use -Encoding as needed.
$updatedFileContent | Set-Content $file