我有一个文本文档,分为标识分支位置的部分,以及仅在该分支下需要替换的占位符。
例如,我需要在新的或相同的文本文件中将'xxxxx'替换为仅在'### Site 3 ###'下的变量:
#### 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
以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
将其写回时,文件不会被破坏。