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
.
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.
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.
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.
Sie können so viele Aufrufe der
replace()
-Methode miteinander verketten, wie nötig sind. Sie sollten jedoch in Betracht ziehen, denreplace
-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.
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.
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.
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.
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.
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.
Alternativ und empfohlen können Sie die Escape()
-Methode des Regex-Typs verwenden, um automatisch alle Sonderzeichen zu entfernen.
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.
Sie möchten den ersten Teil der Zeichenkette gegen den zweiten Teil austauschen, sodass sie so aussehen:
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.
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.
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.