Come usare Replace di PowerShell per sostituire il testo [Esempi]

Come molte altre lingue, PowerShell può lavorare con stringhe e testo. Una delle funzionalità utili è l’utilizzo di PowerShell per sostituire caratteri, stringhe o persino testo all’interno di file.

In questo tutorial, imparerai come utilizzare il metodo replace() e l’operatore replace di PowerShell. Il tutorial coprirà le basi e affronterà anche alcune “divertenti” espressioni regolari!

Prima di iniziare

Non avrai bisogno di molto per seguire tutti gli esempi di questo tutorial; avrai solo bisogno di PowerShell. Gli esempi di questo tutorial utilizzeranno PowerShell v7.0.2, ma tutti gli esempi dovrebbero funzionare in Windows PowerShell.

Utilizzo di PowerShell per sostituire stringhe: le basi

Uno dei casi più semplici in cui utilizzare la sostituzione di PowerShell è quello di sostituire i caratteri nelle stringhe. Iniziamo con alcuni esempi.

Supponiamo di avere una stringa in PowerShell con un valore di ciao, mondo.

$string = 'hello, world'

Vorremmo sostituire la stringa ciao all’interno di quella stringa con la stringa ciao per far sì che la variabile $string abbia un valore di ciao, mondo. Per fare ciò, PowerShell deve prima individuare il testo da “trovare”. Una volta trovato, sostituisce quel testo con un valore definito dall’utente.

Utilizzando il metodo Replace()

Uno dei modi più semplici per sostituire le stringhe in PowerShell è utilizzare il metodo di comando di sostituzione mostrato di seguito. Il metodo replace() ha due argomenti: la stringa da cercare e la stringa con cui sostituire il testo trovato.

Come puoi vedere di seguito, PowerShell sta trovando la stringa hello e sostituendo quella stringa con la stringa hi. Il metodo restituisce quindi il risultato finale che è hi, mondo.

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

Puoi chiamare il metodo di sostituzione di PowerShell su qualsiasi stringa per sostituire qualsiasi stringa letterale con un’altra. Se la stringa da sostituire non viene trovata, il metodo replace() non restituisce nulla.

Non è necessario assegnare una stringa a una variabile per sostituire il testo in una stringa. Invece, puoi invocare il metodo replace() direttamente sulla stringa come: 'hello world'.replace('hello','hi'). Il tutorial utilizza una variabile per comodità.

Rimozione dei caratteri

Forse desideri rimuovere i caratteri in una stringa da un’altra stringa anziché sostituirli con qualcos’altro. Puoi farlo specificando una stringa vuota.

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

Sostituzione di più istanze

Ora hai il codice per sostituire una stringa all’interno di un’altra stringa. Cosa succede se vuoi sostituire più stringhe? Nessun problema.

Poiché il metodo di sostituzione di PowerShell restituisce una stringa, per sostituire un’altra istanza, puoi aggiungere un’altra chiamata al metodo replace() alla fine. PowerShell invoca quindi il metodo replace() sull’output dell’originale.

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

Puoi concatenare quante chiamate al metodo replace() desideri, ma dovresti considerare l’utilizzo dell’operatore replace se devi sostituire molte stringhe.

Utilizzo dell’operatore di sostituzione in PowerShell

Sebbene l’utilizzo del metodo di sostituzione delle stringhe in PowerShell sia il modo più semplice per sostituire del testo, è possibile utilizzare anche l’operatore di sostituzione replace di PowerShell. L’operatore replace è simile al metodo nel senso che fornisci una stringa da cercare e sostituire. Tuttavia, ha un grande vantaggio: la possibilità di utilizzare espressioni regolari (regex) per trovare stringhe corrispondenti (vedremo di più in seguito).

Utilizzando l’esempio precedente, puoi utilizzare l’operatore replace per sostituire hello con hi in modo simile a quanto mostrato di seguito. PowerShell esegue gli stessi passaggi.

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

Rimozione di caratteri

Come il metodo di sostituzione di PowerShell, puoi anche rimuovere caratteri da una stringa utilizzando l’operatore replace. Tuttavia, a differenza del metodo replace(), puoi anche escludere completamente la stringa come argomento da sostituire e otterrai lo stesso effetto.

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

Sostituzione di più istanze

Come il metodo replace(), puoi anche concatenare l’utilizzo dell’operatore replace. Poiché l’operatore replace restituisce una stringa come mostrato di seguito. Vedrai nella prossima sezione che il tuo codice sarà più pulito utilizzando le regex.

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

Utilizzando PowerShell Regex Replace

Come già accennato, il metodo di sostituzione delle stringhe in PowerShell funziona ma è limitato. Sei vincolato ad utilizzare solo stringhe letterali. Non puoi usare caratteri jolly o regex. Se stai eseguendo una sostituzione intermedia o avanzata, dovresti utilizzare l’operatore replace.

Immaginiamo di avere uno script che contiene una stringa creata con una variabile. Tale stringa dovrebbe essere ciao, mondo o salve, mondo. Forse hai avuto una brutta giornata come amministratore di sistema e vuoi cambiare la stringa, indipendentemente dal valore, in arrivederci, mondo.

Hai bisogno che ciao, mondo e salve, mondo vengano entrambi trasformati in arrivederci, mondo. Per farlo, devi utilizzare un’espressione regolare. Puoi abbinare praticamente qualsiasi modello specifico nel testo con regex.

In questo esempio, puoi utilizzare l’espressione ciao|salve per abbinare entrambe le stringhe richieste utilizzando il regex carattere “o” (|) come puoi vedere qui sotto.

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

Una volta imparato ad usare regex per trovare le stringhe, puoi usare PowerShell per sostituire le stringhe jolly che corrispondono a qualsiasi modello.

Caratteri Regex da Escape

Nell’esempio di regex sopra, la stringa in cui cercare non conteneva alcun carattere speciale regex. Il linguaggio delle espressioni regolari ha certi caratteri che non vengono interpretati letteralmente come la maggior parte delle lettere e dei numeri.

Ad esempio, forse devi sostituire del testo in una stringa. Questa stringa contiene un paio di caratteri speciali regex come una parentesi quadra e un punto interrogativo. Tenti quindi di sostituire la stringa [hello] con goodbye come mostrato di seguito.

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

Chiaramente non è quello che intendevi. Questo scenario si verifica quando usi caratteri speciali regex all’interno della stringa da cercare ([hello]).

Per evitare questo problema, hai due opzioni. Puoi o escapare questi caratteri speciali anteporre un backslash davanti a ciascun carattere o utilizzare il metodo Escape().

Di seguito puoi vedere l’effetto dell’escape di ciascun carattere speciale con un backslash.

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

In alternativa, e consigliato, puoi utilizzare il metodo Escape() del tipo regex per rimuovere automaticamente tutti i caratteri speciali.

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

Dovresti utilizzare il metodo Escape() quando possibile perché eseguirà l’escape di tutti i caratteri speciali in modo che tu non debba ricordarli.

Utilizzando Gruppi di Ricerca/Cattura

In tutti gli esempi precedenti, questo tutorial ha usato una stringa letterale per sostituire un’altra stringa. Hai usato hi o goodbye. Ma cosa succede se vuoi usare uno o più caratteri che PowerShell ha trovato nella stringa da sostituire? Dovrai fare corrispondere o catturare gruppi.

Regex ha un concetto chiamato gruppi di cattura e riferimenti inversi. I gruppi di cattura ti permettono di catturare stringhe per poi fare riferimento altrove. PowerShell sfrutta questa funzionalità usando gruppi di corrispondenza con l’operatore replace.

Per esempio, forse hai una stringa che potrebbe contenere alcuni valori diversi.

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

Vorresti scambiare la prima parte della stringa con la seconda parte facendole apparire così:

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

Per eseguire questa azione, PowerShell deve trovare tutto il testo a destra e a sinistra della virgola. Una volta che sa qual è quel testo, deve quindi sostituirne uno con l’altro. Per farlo, hai bisogno di riferimenti inversi.

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.

Puoi vedere un esempio qui sotto.

## Questa stringa potrebbe anche essere:
## 'hi, mondo, ora vai via'
## 'ciao, terra, oggi sei incantevole'
PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(.*), (.*)','$2,$1'
you sexy beast,hello world

Nell’esempio sopra, puoi vedere che i gruppi di cattura regex racchiudono ogni corrispondenza (hello world) e (you sexy beast) tra parentesi. Poi, per la sostituzione, viene prima cercata la corrispondenza di hello word da sinistra a destra, quindi riceve un’etichetta di riferimento di $1 e you sexy beast riceve un’etichetta di riferimento di $2.

Una volta che PowerShell conosce il valore di ogni corrispondenza, puoi utilizzare questi riferimenti nel testo sostituito nel modo che preferisci. In questo esempio, $2,$1 scambia le loro posizioni.

Utilizzo di gruppi di cattura con nomi

Se preferisci non utilizzare segnaposto numerici come $1, $2 per fare riferimento ai valori delle corrispondenze, puoi utilizzare anche etichette o nomi. Invece di dover contare da sinistra a destra quale riferimento corrisponde a cosa, puoi semplicemente utilizzare i nomi.

Per utilizzare i nomi come riferimenti, devi prima definire delle etichette per ogni corrispondenza nella stringa di corrispondenza. Per farlo, devi definire il gruppo di cattura come (?<etichetta><regex>) dove etichetta è il nome e <regex> è l’espressione regolare che stai utilizzando.

Una volta definiti i nomi, puoi quindi farvi riferimento nella stringa di sostituzione utilizzando un simbolo del dollaro e racchiudendo il nome tra parentesi graffe, ad esempio ${etichetta}.

Puoi vedere una dimostrazione di questa tecnica di seguito.

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

Conclusioni

Come hai imparato, l’operatore di sostituzione di PowerShell ti consente di sostituire caratteri, testo e stringhe in molti modi diversi. Per effettuare sostituzioni semplici, puoi utilizzare il metodo replace(), ma se hai bisogno di fare corrispondenze e sostituire qualcosa di più avanzato, utilizza sempre l’operatore replace.

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