2017-12-27 162 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

非常好。謝謝! –

相關問題