2017-12-27 12 views
0

私は、枝の場所を識別するセクションと、その枝の下でのみ置換する必要があるプレースホルダを分割したテキストドキュメントを持っています。文字列の最初のインスタンスを変数または他の一意の文字列の後に置き換えます。

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

I:

は、例えば、私は、新しいまたは同じテキストファイルの '###サイト3 ###'下の変数と'XXXXX'を交換する必要がありますIndexOf()を使い始める行番号を特定する行に沿って何かを考えています。その行の後にある最初のインスタンスを開始して置き換えることができますが、それを最もうまく行う方法を見つけることは困難です。ループ、文字列メソッド、または他の何か?

Write-Host "new is:" -ForegroundColor DarkRed 
$re = [regex]'xxxxx' 
$output = $re.Replace([string]::Join("`n", ($t)), $Replace, 1) 
$output 

答えて

1

スプリット2つの連続した改行でファイル、そして、あなたの条件に一致するものをチャンクで文字列を置換:実際に私は今のReplace()を使用してい置き換える行うには

$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))のため、文字列を分割すると、2つの連続した改行のうちの2番目の行だけが削除されるため、Set-Contentを書き戻すとファイルがマングルされません。

+0

優れています。ありがとうございました! –

関連する問題