Zoals veel andere talen kan PowerShell werken met strings en tekst. Een van die handige functies is het gebruik van PowerShell om tekens, strings of zelfs tekst in bestanden te vervangen.
In deze tutorial ga je leren hoe je de PowerShell replace()
-methode en de PowerShell replace
-operator kunt gebruiken. De tutorial zal de basisprincipes behandelen en zelfs ingaan op enkele “leuke” reguliere expressies!
Voordat je begint
Je hebt niet veel nodig om alle voorbeelden in deze tutorial te volgen; je hebt alleen PowerShell nodig. Deze voorbeelden van de tutorial zullen gebruik maken van PowerShell v7.0.2, maar alle voorbeelden zouden moeten werken in Windows PowerShell.
PowerShell gebruiken om strings te vervangen: De basis
Een van de eenvoudigste gevallen van het gebruik van PowerShell replace is het vervangen van tekens in strings. Laten we daar beginnen met wat voorbeelden.
Stel dat je een string hebt in PowerShell met de waarde hallo, wereld
.
Je wilt de string hallo
vervangen door de string hi
in die string, zodat de variabele $string
de waarde hi, wereld
heeft. Om dat te doen, moet PowerShell eerst bepalen waar de “zoek” tekst is. Eenmaal gevonden, vervangt het die tekst vervolgens door een door de gebruiker gedefinieerde waarde.
Het gebruik van de Replace()
methode
Een van de gemakkelijkste manieren om strings te vervangen in PowerShell is met behulp van de replace command methode zoals hieronder weergegeven. De replace()
methode heeft twee argumenten: de te vinden string en de string waarmee de gevonden tekst moet worden vervangen.
Zoals je hieronder kunt zien, zoekt PowerShell naar de string hello
en vervangt deze met de string hi
. De methode geeft vervolgens het uiteindelijke resultaat terug, wat hi, world
is.
Je kunt de replace methode van PowerShell oproepen op elke string om een letterlijke string te vervangen door een andere. Als de te vervangen string niet wordt gevonden, geeft de replace()
methode niets terug.
Je hoeft geen string toe te wijzen aan een variabele om tekst in een string te vervangen. In plaats daarvan kun je de
replace()
methode rechtstreeks op de string aanroepen, zoals:'hello world'.replace('hello','hi')
. De tutorial gebruikt een variabele voor het gemak.
Verwijderen van tekens
Misschien wil je tekens verwijderen uit een string in plaats van ze te vervangen door iets anders. Dat kan ook door een lege string op te geven.
Het vervangen van meerdere exemplaren
Je hebt nu de code om een string binnen een andere string te vervangen. Maar hoe zit het met het vervangen van meerdere strings? Geen probleem.
Aangezien de PowerShell replace methode een string teruggeeft, kun je om een andere instantie te vervangen een extra replace()
methodeaanroep toevoegen aan het einde. PowerShell roept dan de replace()
methode aan op de uitvoer van de oorspronkelijke methode.
Je kunt zoveel
replace()
-methode-oproepen aan elkaar koppelen als nodig is, maar je zou moeten overwegen om dereplace
-operator te gebruiken als je veel strings moet vervangen.
Het gebruik van de PowerShell Vervangingsoperator
Hoewel het gebruik van de PowerShell vervangende string-methode de eenvoudigste manier is om tekst te vervangen, kun je ook de PowerShell replace
-operator gebruiken. De replace
-operator is vergelijkbaar met de methode waarbij je een te vinden en te vervangen string opgeeft. Maar, het heeft één groot voordeel; het vermogen om reguliere expressies (regex) te gebruiken om overeenkomende strings te vinden (later meer hierover).
Met het bovenstaande voorbeeld kun je de replace
-operator gebruiken om hello
te vervangen door hi
op een vergelijkbare manier zoals hieronder getoond. PowerShell voert dezelfde stappen uit.
Tekens verwijderen
Net als de PowerShell vervangende methode, kun je ook tekens uit een string verwijderen met behulp van de replace
-operator. Maar, in tegenstelling tot de replace()
-methode, kun je ook de string volledig uitsluiten als argument om mee te vervangen en zul je hetzelfde effect ontdekken.
Meerdere instanties vervangen
Net als bij de replace()
-methode, kun je ook samenstellingen van het gebruik van de replace
-operator aan elkaar koppelen. Aangezien de replace
-operator een string retourneert zoals hieronder getoond. Zoals je zult zien in de volgende sectie, zal je code schoner zijn bij gebruik van regex.
Gebruik van PowerShell Regex Replace
Zoals hierboven vermeld, werkt het vervangen van strings in de PowerShell replace-methode, maar het is beperkt. Je bent beperkt tot het gebruik van letterlijke strings. Je kunt geen wildcards of regex gebruiken. Als je enige vorm van tussenliggende of geavanceerde vervanging uitvoert, moet je de replace
-operator gebruiken.
Laten we zeggen dat je een script hebt dat een string bevat die is gemaakt met een variabele. Die string zou ofwel hello, world
of hi, world.
moeten zijn. Misschien heb je een slechte dag gehad als systeembeheerder en wil je de string veranderen, ongeacht de waarde, naar goodbye, world
.
Je hebt hello, world
en hi, world
beide nodig om te worden getransformeerd naar goodbye, world
. Om dit te laten gebeuren, moet je een reguliere expressie gebruiken. Je kunt bijna elk specifiek patroon in tekst matchen met regex.
In dit voorbeeld kun je de expressie hello|hi
gebruiken om beide vereiste strings te matchen met behulp van de regex “of” (|
) karakter, zoals je hieronder kunt zien.
Zodra je hebt geleerd hoe je regex moet gebruiken om strings te vinden, kun je PowerShell gebruiken om wildcard-strings die elk patroon matchen te vervangen.
Het ontsnappen van Regex-karakters
In het bovenstaande regex-voorbeeld bevatte de te doorzoeken string geen speciale tekens van regex. De reguliere expressietaal gebruikt bepaalde tekens die niet letterlijk worden geïnterpreteerd, in tegenstelling tot de meeste letters en cijfers.
Bijvoorbeeld, misschien moet je tekst vervangen in een string. Die string bevat een paar speciale tekens van regex, zoals een haakje en een vraagteken. Vervolgens probeer je de string [hello]
te vervangen door goodbye
, zoals hieronder getoond.
Dat is duidelijk niet wat je bedoelde. Deze situatie doet zich voor wanneer je speciale tekens van regex gebruikt binnenin de te vinden string ([hello]
).
Om dit probleem te voorkomen, heb je twee opties. Je kunt deze speciale tekens ofwel escapen door een backslash aan de voorkant van elk karakter toe te voegen, of je kunt de Escape()
-methode gebruiken.
Hieronder zie je het effect van het escapen van elk speciaal karakter met een backslash.
Als alternatief, en aanbevolen, kun je de Escape()
-methode van het regex-type gebruiken om automatisch alle speciale tekens te verwijderen.
Je zou de
Escape()
-methode moeten gebruiken waar mogelijk, omdat het alle speciale tekens escapet, zodat je ze niet hoeft te onthouden.
Gebruik van Match/Capture Groups
In al de vorige voorbeelden heeft deze tutorial een letterlijke tekenreeks gebruikt om een andere tekenreeks te vervangen. Je hebt hi
of goodbye
gebruikt. Maar wat als je één of meer karakters wilt gebruiken die PowerShell in de tekenreeks heeft gevonden om mee te vervangen? Je zult matchen of vangroepen moeten gebruiken.
Regex heeft een concept genaamd vangroepen en terugverwijzingen. Vangroepen stellen je in staat om tekenreeksen vast te leggen om ze vervolgens ergens anders te refereren. PowerShell maakt gebruik van deze functies door matchgroepen te gebruiken met de replace
-operator.
Bijvoorbeeld, misschien heb je een tekenreeks die een paar verschillende waarden kan bevatten.
Je wilt het eerste deel van de tekenreeks verwisselen met het tweede deel, zodat ze er zo uitzien:
Om deze actie uit te voeren, moet PowerShell al de tekst links en rechts van de komma vinden. Zodra het weet wat die tekst is, moet het één ervan vervangen door de andere. Daarvoor heb je terugverwijzingen nodig.
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.
Je kunt hieronder een voorbeeld zien.
In het bovenstaande voorbeeld zie je regex-capturegroepen die elk overeenkomen met (hello world
) en (you sexy beast
) met behulp van haakjes. Vervolgens wordt voor de vervanging hello world
eerst van links naar rechts gematcht, dus krijgt het een $1
terugverwijzingslabel en krijgt you sexy beast
een $2
terugverwijzingslabel.
Zodra PowerShell de waarde voor elke overeenkomst kent, kun je deze verwijzingen op elke gewenste manier gebruiken in de vervangen tekst. In dit voorbeeld $2,$1
wisselen hun posities om.
Gebruik van benoemde overeenkomstgroepen
Als je liever geen nummerplaatsaanduidingen zoals $1
, $2
wilt gebruiken om overeenkomstwaarden te verwijzen, kun je ook labels of namen gebruiken. In plaats van van links naar rechts te moeten tellen wat de referenties betekenen, kun je eenvoudig namen gebruiken.
Om namen als referenties te gebruiken, moet je eerst labels definiëren voor elke overeenkomst in de matchreeks. Om dat te doen, moet je de capturegroep definiëren als (?<label><regex>)
waar label
de naam is en <regex>
de reguliere expressie is die je gebruikt.
Zodra je de namen hebt gedefinieerd, kun je ze vervolgens refereren in de vervangende string met behulp van een dollarteken en de naam tussen accolades bijvoorbeeld ${label}
.
Je kunt hieronder een demonstratie van deze techniek zien.
Conclusie
Zoals je hebt geleerd, stelt de PowerShell vervangingsoperator je in staat om karakters, tekst en strings op vele verschillende manieren te vervangen. Voor eenvoudige vervangingen kun je de replace()
methode gebruiken, maar als je iets geavanceerders moet matchen en vervangen, gebruik dan altijd de replace
operator.