как скопировать строки из файла файл после совпадающей строки в файле с помощью сценария powershell

#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'