So verwenden Sie PowerShell Replace zum Ersetzen von Text [Beispiele]

Wie viele andere Sprachen kann PowerShell mit Zeichenketten und Text arbeiten. Eine dieser nützlichen Funktionen besteht darin, PowerShell zum Ersetzen von Zeichen, Zeichenketten oder sogar Text in Dateien zu verwenden.

In diesem Tutorial lernen Sie, wie Sie die PowerShell-Methode replace() und den PowerShell-Operator replace verwenden können. Das Tutorial behandelt die Grundlagen und geht sogar auf einige „spaßige“ reguläre Ausdrücke ein!

Bevor Sie beginnen

Sie benötigen nicht viel, um allen Beispielen in diesem Tutorial folgen zu können; Sie benötigen lediglich PowerShell. Dieses Tutorial verwendet PowerShell v7.0.2, aber alle Beispiele sollten in Windows PowerShell funktionieren.

Verwendung von PowerShell zum Ersetzen von Zeichenketten: Die Grundlagen

Einer der einfachsten Fälle bei der Verwendung von PowerShell replace besteht darin, Zeichen in Zeichenketten zu ersetzen. Fangen wir mit einigen Beispielen an.

Angenommen, Sie haben eine Zeichenkette in PowerShell mit dem Wert hallo, welt.

$string = 'hello, world'

Sie möchten die Zeichenkette hallo in dieser Zeichenkette durch die Zeichenkette hi ersetzen, um die Variable $string den Wert hi, welt zu haben. Dazu muss PowerShell zunächst herausfinden, wo sich der „Suchen“-Text befindet. Sobald er gefunden wurde, ersetzt er diesen Text durch einen benutzerdefinierten Wert.

Verwenden der Replace()-Methode

Eine der einfachsten Möglichkeiten, Zeichenfolgen in PowerShell zu ersetzen, ist die Verwendung der Replace-Befehls Methode, wie unten gezeigt. Die replace()-Methode hat zwei Argumente; die zu findende Zeichenfolge und die Zeichenfolge, mit der der gefundene Text ersetzt werden soll.

Wie unten zu sehen ist, sucht PowerShell nach der Zeichenfolge hello und ersetzt diese Zeichenfolge durch die Zeichenfolge hi. Die Methode gibt dann das endgültige Ergebnis zurück, das hi, world lautet.

PS> $string.replace('hello','hi')
hi, world

Sie können die PowerShell-Ersetzungsmethode auf jede Zeichenfolge anwenden, um eine beliebige Zeichenfolge durch eine andere zu ersetzen. Wenn die zu ersetzende Zeichenfolge nicht gefunden wird, gibt die replace()-Methode nichts zurück.

Sie müssen einer Zeichenfolge keine Variable zuweisen, um Text in einer Zeichenfolge zu ersetzen. Stattdessen können Sie die replace()-Methode direkt auf die Zeichenfolge anwenden, z. B.: 'hello world'.replace('hello','hi'). Das Tutorial verwendet eine Variable aus Gründen der Bequemlichkeit.

Entfernen von Zeichen

Vielleicht möchten Sie Zeichen in einer Zeichenfolge aus einer anderen Zeichenfolge entfernen, anstatt sie durch etwas anderes zu ersetzen. Das können Sie auch tun, indem Sie eine leere Zeichenfolge angeben.

PS> $string.replace('hello','')
, world

Ersetzen von mehreren Instanzen

Sie haben jetzt den Code, um eine Zeichenfolge innerhalb einer anderen Zeichenfolge zu ersetzen. Was ist mit dem Ersetzen mehrerer Zeichenfolgen? Kein Problem.

Weil die PowerShell-Ersetzungsmethode eine Zeichenfolge zurückgibt, können Sie zur Ersetzung einer weiteren Instanz einen weiteren Aufruf der replace()-Methode am Ende anhängen. PowerShell ruft dann die replace()-Methode auf der Ausgabe des Originals auf.

PS> $string.replace('hello','').replace('world','earth')
, earth

Sie können so viele Aufrufe der replace()-Methode miteinander verketten, wie nötig sind. Sie sollten jedoch in Betracht ziehen, den replace-Operator zu verwenden, wenn Sie viele Zeichenketten ersetzen müssen.

Verwendung des PowerShell Replace Operators

Auch wenn die Verwendung der PowerShell-Ersetzungsmethode die einfachste Möglichkeit ist, Text zu ersetzen, können Sie auch den PowerShell replace-Operator verwenden. Der replace-Operator ist ähnlich wie die Methode, bei der Sie einen String zum Suchen und Ersetzen bereitstellen. Aber er hat einen großen Vorteil: die Möglichkeit, reguläre Ausdrücke (Regex) zum Suchen passender Zeichenketten zu verwenden (mehr dazu später).

Mit dem obigen Beispiel können Sie den replace-Operator verwenden, um hello durch hi auf ähnliche Weise wie unten gezeigt zu ersetzen. PowerShell führt die gleichen Schritte aus.

PS> $string -replace 'hello','hi'
hi, world

Entfernen von Zeichen

Wie bei der PowerShell-Ersetzungsmethode können Sie auch Zeichen aus einer Zeichenkette mit dem replace-Operator entfernen. Im Gegensatz zur replace()-Methode können Sie jedoch auch den String vollständig ausschließen, der als Argument zum Ersetzen verwendet wird, und den gleichen Effekt feststellen.

PS> $string -replace 'hello',''
, world
PS> $string -replace 'hello'
, world

Ersetzen von mehreren Instanzen

Wie bei der replace()-Methode können Sie auch den replace-Operator in aufeinanderfolgenden Anwendungen verketten. Da der replace-Operator eine Zeichenkette zurückgibt, wie unten gezeigt. Sie werden im nächsten Abschnitt feststellen, dass Ihr Code mit Regex sauberer wird.

PS> $string -replace 'hello','hi' -replace 'world','earth'
hi, earth

Using PowerShell Regex Replace

Wie oben erwähnt, funktioniert das Ersetzen von Zeichenfolgen in der PowerShell-Ersetzungsmethode, ist jedoch eingeschränkt. Sie sind auf die Verwendung von Literalzeichenfolgen beschränkt. Sie können keine Platzhalter oder regulären Ausdrücke verwenden. Wenn Sie eine Zwischen- oder Fortgeschrittenen-Ersetzung durchführen, sollten Sie den replace-Operator verwenden.

Angenommen, Sie haben ein Skript, das eine Zeichenfolge enthält, die mit einer Variable erstellt wird. Diese Zeichenfolge sollte entweder hello, world oder hi, world. sein. Vielleicht haben Sie als Sysadmin einen schlechten Tag und möchten die Zeichenfolge unabhängig vom Wert in goodbye, world ändern.

Sie müssen erreichen, dass sowohl hello, world als auch hi, world in goodbye, world umgewandelt werden. Um dies zu erreichen, müssen Sie einen regulären Ausdruck verwenden. Sie können mit Regex praktisch jedes bestimmte Muster im Text abgleichen.

In diesem Beispiel können Sie den Ausdruck hello|hi verwenden, um beide erforderlichen Zeichenfolgen mit dem Regex „oder“ (|) Zeichen wie unten gezeigt abzugleichen.

PS> 'hello, world' -replace 'hello|hi','goodbye'
goodbye, world
PS> 'hi, world' -replace 'hello|hi','goodbye'   
goodbye, world

Nachdem Sie gelernt haben, wie Sie Regex verwenden, um Zeichenfolgen zu finden, können Sie PowerShell verwenden, um Platzhalterzeichenfolgen zu ersetzen, die irgendeinem Muster entsprechen.

Escape von Regex-Zeichen

Im obigen Regex-Beispiel enthielt der zu durchsuchende String keine Regex-Sonderzeichen. Die reguläre Ausdruckssprache verwendet bestimmte Zeichen, die nicht wörtlich interpretiert werden wie die meisten Buchstaben und Zahlen.

Zum Beispiel müssen Sie möglicherweise Text in einem String ersetzen. Dieser String enthält ein paar Regex-Sonderzeichen wie eine Klammer und ein Fragezeichen. Sie versuchen dann, den String [hello] durch goodbye zu ersetzen, wie unten gezeigt.

PS> '[hello], world' -replace '[hello]','goodbye'
[goodbyegoodbyegoodbyegoodbyegoodbye], wgoodbyergoodbyed

Das ist offensichtlich nicht das, was Sie beabsichtigt haben. Dieses Szenario tritt auf, wenn Sie Regex-Sonderzeichen innerhalb des zu findenden Strings verwenden ([hello]).

Um dieses Problem zu vermeiden, haben Sie zwei Möglichkeiten. Sie können entweder diese Sonderzeichen escapen, indem Sie jedem Zeichen vorne einen Backslash voranstellen, oder die Escape()-Methode verwenden.

Im Folgenden können Sie sehen, wie sich das Escapen jedes Sonderzeichens mit einem Backslash auswirkt.

PS> '[hello], world' -replace '\[hello\]','goodbye'
goodbye, world

Alternativ und empfohlen können Sie die Escape()-Methode des Regex-Typs verwenden, um automatisch alle Sonderzeichen zu entfernen.

PS> '[hello], world' -replace ([regex]::Escape('[hello]')),'goodbye'
goodbye, world

Sie sollten die Escape()-Methode verwenden, wo immer möglich, da sie alle Sonderzeichen escapet, sodass Sie sich nicht an sie erinnern müssen.

Verwenden von Match-/Erfassungsgruppen

Im allen vorherigen Beispielen wurde in diesem Tutorial eine wörtliche Zeichenkette verwendet, um eine andere Zeichenkette zu ersetzen. Sie haben hi oder goodbye verwendet. Aber was ist, wenn Sie ein oder mehrere Zeichen verwenden möchten, die PowerShell in der Zeichenkette gefunden hat, um sie zu ersetzen? Sie müssen Übereinstimmungsgruppen oder Aufzeichnungsgruppen verwenden.

Regex hat ein Konzept namens Aufzeichnungsgruppen und Rückverweise. Aufzeichnungsgruppen ermöglichen es Ihnen, Zeichenketten zu erfassen, um sie dann an anderer Stelle zu referenzieren. PowerShell nutzt diese Funktion, indem es Übereinstimmungsgruppen mit dem replace-Operator verwendet.

Beispielsweise haben Sie möglicherweise eine Zeichenkette, die verschiedene Werte enthalten könnte.

'hello world, you sexy beast'
'hi world, now go away'
'hello earth, you are lovely today'

Sie möchten den ersten Teil der Zeichenkette gegen den zweiten Teil austauschen, sodass sie so aussehen:

'you sexy beast,hello world'
'now go away,hi world'
'you are lovely today,hello earth'

Um diese Aktion auszuführen, muss PowerShell den Text rechts und links vom Komma finden. Nachdem es weiß, welcher Text das ist, muss es einen durch den anderen ersetzen. Dafür benötigen Sie Rückverweise.

A backreference is a regex variable (not a PowerShell variable) that represents the text that regex matched. Backreferences in PowerShell are represented with a dollar sign followed by a number indicating the order in which they were matched.

Sie können unten ein Beispiel sehen.

## Diese Zeichenkette könnte auch sein:
## 'hi, world, jetzt geh weg'
## 'hallo, Erde, du bist heute schön'
PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(.*), (.*)','$2,$1'
you sexy beast,hello world

Im obigen Beispiel sehen Sie Regex-Capture-Gruppen, die jeden Treffer (hello world) und (you sexy beast) mit Klammern umgeben. Dann wurde für die Ersetzung hello world zuerst von links nach rechts übereinstimmend gefunden, sodass es ein $1-Rückverweislabel und you sexy beast ein $2-Rückverweislabel erhält.

Sobald PowerShell den Wert für jeden Treffer kennt, können Sie diese Verweise im ersetzten Text beliebig verwenden. In diesem Beispiel vertauscht $2,$1 ihre Positionen.

Verwenden benannter Treffergruppen

Wenn Sie lieber keine Zahlenplatzhalter wie $1, $2 zur Referenzierung von Trefferwerten verwenden möchten, können Sie auch Labels oder Namen verwenden. Anstatt von links nach rechts zu zählen, was die Verweise bedeuten, können Sie einfach Namen verwenden.

Um Namen als Verweise zu verwenden, müssen Sie zunächst Labels für jeden Treffer im Trefferstring definieren. Dazu müssen Sie die Erfassungsgruppe wie folgt definieren: (?<label><regex>), wobei label der Name und <regex> der reguläre Ausdruck ist, den Sie verwenden.

Nachdem Sie die Namen definiert haben, können Sie sie im Ersatzstring mithilfe eines Dollarzeichens und der Umklammerung des Namens in geschweiften Klammern referenzieren, z. ${label}.

Eine Demonstration dieser Technik finden Sie unten.

PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(?<First_Part>.*), (?<Second_Part>.*)','${Second_Part},${First_Part}'
you sexy beast,hello, world

Abschluss

Wie Sie gelernt haben, ermöglicht Ihnen der PowerShell-Ersetzungsoperator, Zeichen, Texte und Zeichenfolgen auf viele verschiedene Arten zu ersetzen. Um einfache Ersetzungen durchzuführen, können Sie die replace()-Methode verwenden. Wenn Sie jedoch fortgeschrittenere Übereinstimmungen und Ersetzungen benötigen, verwenden Sie immer den replace-Operator.

Source:
https://adamtheautomator.com/powershell-replace/