2016-05-23 10 views
1

Ich habe eine Textdatei, wo ich überprüfen muss, ob ein spezielles Zeichen an einer speziellen Position vorhanden ist.Fügen Sie Zeichen in Zeichenfolge vom Ende

Zuerst finde ich heraus, ob das Zeichen vorhanden ist oder nicht. Wenn es nicht ist, möchte ich es an der Stelle hinzufügen, an der es fehlt. Das Problem ist, dass sich die Anzahl der Zeichen vor dem Zeichen, das ich überprüfe, ändert. Das bedeutet, dass ich das Zeichen nicht ständig an der gleichen Stelle mit insert hinzufügen kann.

Das Ende der Zeichenfolge sieht immer gleich aus. Gibt es einen Weg, wo ich das Zeichen direkt an der Position hinzufügen kann, wo es fehlt oder es an einer Stelle nach dem Zählen einer Anzahl von Zeichen rückwärts vom Ende der Zeichenfolge einfügen?

Im Moment sieht mein Code wie folgt aus:

$content = Get-Content Path\to\file.txt 
foreach ($line in $content) { 
    if ($line[-6] -ne '\') { 
     #Add character here 
    } 
    echo $line 
} 

EDIT:

Das tut, was ich will, aber ich denke, es ist von einer guten Lösung weit entfernt ist:

$content = Get-Content path\to\file.txt 
foreach ($line in $content) { 
    if ($line[-25] -ne '\') { 
     $new_line = $line.Split(';')[0] 
     $new_line1 = $line.Split(';')[1] + '\' | % {$_ -replace '"', ''} 
     $new_line2 = $line.Split(';')[2] 
     $test = Write-Host $new_line';"'$new_line1'";'$new_line2 
    } 
} 
echo $test 

Antwort

2

Sie können einen regulären Ausdruck Ersatz mit einem negativen Lookbehind und eine positive Vorschau tun:

$line -replace '(?<!\\)(?=.{6}$)', '\' 

(?<!...) ist ein negatives Lookbehind, im Grunde bedeutet, „nicht vor dem Spiel nicht existiert“, "Dies" ist hier ein wörtlicher Backslash.
(?=...) ist ein positiver Lookahead, was bedeutet "dies existiert nach dem Match", wobei "dies" eine Sequenz von 6 Zeichen (.{6}) am Ende des Strings ($) ist.

Beide Lookahead- und Lookbehind-Ausdrücke werden nicht Teil der Übereinstimmung, daher ersetzt die obige Operation einfach die leere Zeichenfolge zwischen negativem Lookbehind und positivem Lookahead durch einen umgekehrten Schrägstrich (wodurch dieses Zeichen effektiv in die Zeichenfolge eingefügt wird) Nur wenn den 6 Zeichen am Ende der Zeichenfolge nicht bereits ein Backslash vorangestellt ist.

+0

Genau das habe ich gesucht! Thx Jetzt muss ich nur herausfinden, wie man das Zeichen direkt in die Datei ersetzt. – BallerNacken

+0

'(Get-Content Dateiname) -replace ... | Set-Content Dateiname' –

1

Dies kann mit regex auch zu ersetzen (einzeilig):

Angenommen, Ihre Sonderzeichen ein % ist und Sie wollen immer es an der drittletzten Position bringen:

"12345689" -replace '^(.*?)%?(.{2})$', '$1%$2' 

Ergebnis:

1234567%89 

Wenn Sie bereits die % an der richtigen Stelle, es gewann‘ t Änderung:

"123456%89" -replace '^(.*?)%?(.{2})$', '$1%$2' 

Ergebnis:

1234567%89 

Regex Demo.

Verwandte Themen