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

时间:2017-12-27 18:37:28

标签: powershell

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

例如,我需要将&#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

1 个答案:

答案 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将其写回时文件不会被破坏