#powershell #powershell-2.0
Вопрос:
У меня есть файл конфигурации yml, как показано ниже..Я хочу скопировать все строки до конца файла после совпадения строки «журналы:».
# numberof Threads
encryptionKey: "abcd"
logs:
- displayName: "RLM_Failure"
logDirectory: "/optware/msste/legaluat/log"
logName: "DSSErrors.log"
searchStrings:
#displayName Should be unique across the patterns including the case.
- displayName: "RLM_Dependency"
pattern: "Merge fails entirely because needed objects"
matchExactString: false
caseSensitive: false
Я попытался выполнить эту команду
Select-String "^logs: "/path/old/config.yml -Context 0, 100 |
% {$_.Context.PostContext} |
Add-Content "/path/new/config.yml"
Но это справляется только с 100 строками после совпадающей строки… Есть ли в любом случае, чего я могу добиться, не указывая номера строк.
Ответ №1:
Прочитайте файл в переменную строка за строкой, используйте метод .Where()
расширения в SkipUntil
режиме , чтобы захватить все, кроме предыдущих строк logs:
, а затем используйте Select-Object -Skip 1
, чтобы пропустить саму logs:
строку:
$lines = Get-Content /path/old/config.yml
$lines.Where({$_ -match '^s*logs:s*(#|$)'}, 'SkipUntil') |Select-Object -Skip 1 |Set-Content /path/new/config.yml
Ответ №2:
В качестве альтернативы вы можете использовать switch
вот так:
$outputLine = $false
$newFile = switch -Regex -File '/path/old/config.yml' {
'^logs:' { $outputLine = $true }
default { if ($outputLine) { $_ }}
}
$newFile | Set-Content -Path '/path/new/config.yml'
или
((Get-Content -Path '/path/old/config.yml' -Raw) -split '(?m)^logs:', 2)[-1] |
Set-Content -Path '/path/new/config.yml'