2017-12-27 5 views
0

Ich habe ein Textdokument, das in Abschnitte unterteilt ist, die einen Zweigort angeben, und einen Platzhalter, der nur unter diesem Zweig ersetzt werden muss.Ersetze die erste Instanz einer Zeichenfolge nach einer Variablen oder einer anderen eindeutigen Zeichenfolge

Zum Beispiel muss ich die 'xxxxx' nur unter '### Seite 3 ###' in einem neuen oder der gleichen Textdatei mit einer Variablen ersetzen:

 
#### 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 Ich denke an etwas in der Art der Identifizierung der Zeilennummer, die ich mit IndexOf() beginnen möchte. Ich kann die Zeile identifizieren, die wir starten können, und die erste Instanz ersetzen, die nach dieser Zeile gefunden wurde, aber es ist schwierig, herauszufinden, wie man es am besten macht. Eine Schleife, eine String-Methode oder etwas anderes?

Um die tatsächlich ersetze ich Replace() jetzt bin mit:

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

Antwort

1

Split die Datei an 2 aufeinander folgenden Zeilenumbrüche, dann die Zeichenfolge ersetzen nur in jenen Stücken, die Ihren Kriterien entsprechen:

$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 

Aufgrund der positiven Lookbehind-Assertion ((?<=\r?\n)) wird durch das Aufteilen des Strings nur der zweite der beiden aufeinanderfolgenden Zeilenumbrüche entfernt, so dass die Datei nicht beschädigt wird, wenn Set-Content sie zurückschreibt.

+0

Ausgezeichnet. Vielen Dank! –

Verwandte Themen