在变量或其他唯一字符串后替换字符串的第一个实例

问题描述 投票:0回答:1

我有一个文本文档,分为标识分支位置的部分,以及仅在该分支下需要替换的占位符。

例如,我需要在新的或相同的文本文件中将'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
powershell
1个回答
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将其写回时,文件不会被破坏。

© www.soinside.com 2019 - 2024. All rights reserved.