2017-12-27 372 views
0

我有一个文本文档被分解为标识分支位置的部分以及需要仅在该分支下被替换的占位符。将一个字符串的第一个实例替换为一个变量或其他唯一字符串

例如,我只需要在“###网站的3 ###”在新的或相同的文本文件替换“XXXXX”一个变量:

 
#### 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

斯普利特在连续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写回时文件不会变形。

+0

非常好。谢谢! –

相关问题