如何使用powershell脚本在文件中的匹配字符串之后从文件中复制行
how to copy a lines from a file a file after matched string in a file using powershell script
我有如下所示的配置 yml 文件。我想在匹配字符串“logs:”后复制所有行直到文件末尾:
# 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 行...无论如何我可以在不指定行号的情况下实现。
将文件逐行读入变量,在SkipUntil
模式下使用.Where()
扩展方法抓取除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
作为替代方案,您可以像这样使用 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'
我有如下所示的配置 yml 文件。我想在匹配字符串“logs:”后复制所有行直到文件末尾:
# 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 行...无论如何我可以在不指定行号的情况下实现。
将文件逐行读入变量,在SkipUntil
模式下使用.Where()
扩展方法抓取除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
作为替代方案,您可以像这样使用 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'