我将文本文档分解为标识分支位置的部分,以及仅在该分支下需要替换的占位符。
例如,我需要将&#39; xxxxx&#39; 替换为仅在&#39; ### Site 3 ###&#39; <下的变量/ em>在新的或相同的文本文件中:
#### Site 1 ### jlkfd, fdjks, fdsfdsa jlk3d, jllww, fjcnncc xxxxx, jflkd, jfkdlww hbubd, q0q0i, jodsssj ### Site 2 ### jlkfd, fdjks, fdsfdsa jlk3d, jllww, fjcnncc xxxxx, jflkd, jfkdlww hbubd, q0q0i, jodsssj ### Site 3 ### jlkfd, fdjks, fdsfdsa jlk3d, jllww, fjcnncc xxxxx, jflkd, jfkdlww hbubd, q0q0i, jodsssj ### Site 4 ### jlkfd, fdjks, fdsfdsa jlk3d, jllww, fjcnncc xxxxx, jflkd, jfkdlww hbubd, q0q0i, jodsssj
我正在考虑使用IndexOf()
确定我想要开始使用的行号。我可以确定我们可以开始的行并替换在该行之后找到的第一个实例,但很难找到如何做到最好。循环,字符串方法或其他什么?
要实际使用Replace()
替换我现在:
Write-Host "new is:" -ForegroundColor DarkRed
$re = [regex]'xxxxx'
$output = $re.Replace([string]::Join("`n", ($t)), $Replace, 1)
$output
答案 0 :(得分:1)
以2个连续的换行符拆分文件,然后仅在符合条件的那些块中替换字符串:
$file = 'C:\path\to\your.txt'
(Get-Content $file -Raw) -split '(?<=\r?\n)\r?\n' | ForEach-Object {
if ($_ -like '*### Site 3 ###*') {
$_ -replace 'xxxxx', $replace
} else {
$_
}
} | Set-Content $file
由于积极的lookbehind断言((?<=\r?\n)
),拆分字符串只会删除两个连续换行符中的第二个,这样当Set-Content
将其写回时文件不会被破坏