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
.
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
.
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.
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.
Puoi concatenare quante chiamate al metodo
replace()
desideri, ma dovresti considerare l’utilizzo dell’operatorereplace
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.
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.
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.
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.
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.
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.
In alternativa, e consigliato, puoi utilizzare il metodo Escape()
del tipo regex per rimuovere automaticamente tutti i caratteri speciali.
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.
Vorresti scambiare la prima parte della stringa con la seconda parte facendole apparire così:
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.
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.
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
.