Como Usar o Replace do PowerShell para Substituir Texto [Exemplos]

Como muitas outras linguagens por aí, o PowerShell pode trabalhar com strings e texto. Uma dessas características úteis é usar o PowerShell para substituir caracteres, strings ou até mesmo texto dentro de arquivos.

Neste tutorial, você vai aprender como usar o método replace() do PowerShell e o operador replace do PowerShell. O tutorial cobrirá o básico e até mergulhará em algumas “divertidas” expressões regulares!

Antes de Começar

Você não vai precisar de muito para acompanhar todos os exemplos deste tutorial; você só vai precisar do PowerShell. Este tutorial usa exemplos do PowerShell v7.0.2, mas todos os exemplos devem funcionar no Windows PowerShell.

Usando o PowerShell para Substituir Strings: O Básico

Um dos casos mais simples de usar PowerShell replace é substituir caracteres em strings. Vamos começar com alguns exemplos.

Vamos dizer que você tem uma string no PowerShell com um valor de olá, mundo.

$string = 'hello, world'

Você gostaria de substituir a string olá, dentro dessa string, pela string oi para fazer a variável $string ter um valor de oi, mundo. Para fazer isso, o PowerShell primeiro precisa descobrir onde está o texto “encontrar”. Uma vez encontrado, ele substitui esse texto por um valor definido pelo usuário.

Usando o Método Replace()

Uma das maneiras mais simples de substituir strings no PowerShell é usando o método de comando replace, conforme mostrado abaixo. O método replace() possui dois argumentos: a string a ser encontrada e a string pela qual substituir o texto encontrado.

Como você pode ver abaixo, o PowerShell está encontrando a string hello e substituindo essa string pela string hi. O método então retorna o resultado final, que é hi, world.

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

Você pode chamar o método de substituição do PowerShell em qualquer string para substituir qualquer string literal por outra. Se a string a ser substituída não for encontrada, o método replace() não retorna nada.

Você não precisa atribuir uma string a uma variável para substituir texto em uma string. Em vez disso, você pode invocar o método replace() diretamente na string, assim: 'hello world'.replace('hello','hi'). O tutorial está usando uma variável por conveniência.

Removendo Caracteres

Talvez você queira remover caracteres em uma string de outra string, em vez de substituí-los por algo mais. Você também pode fazer isso especificando uma string vazia.

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

Substituindo Múltiplas Instâncias

Agora você tem o código para substituir uma string dentro de outra string. E substituir múltiplas strings? Sem problema.

Já que o método de substituição do PowerShell retorna uma string, para substituir outra instância, você pode anexar outra chamada de método replace() ao final. O PowerShell então invoca o método replace() na saída do original.

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

Você pode encadear quantas chamadas de método replace() forem necessárias, mas deve considerar usar o operador replace se tiver muitas strings para substituir.

Usando o Operador de Substituição do PowerShell

Mesmo que usar o método de string de substituição do PowerShell seja a maneira mais simples de substituir texto, você também pode usar o operador replace do PowerShell. O operador replace é semelhante ao método, pois você fornece uma string para encontrar e substituir. No entanto, ele tem uma grande vantagem; a capacidade de usar expressões regulares (regex) para encontrar strings correspondentes (mais tarde falaremos sobre isso).

Usando o exemplo acima, você pode usar o operador replace para substituir hello por hi de maneira semelhante ao mostrado abaixo. O PowerShell executa as mesmas etapas.

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

Removendo Caracteres

Assim como o método de substituição do PowerShell, você também pode remover caracteres de uma string usando o operador replace. No entanto, ao contrário do método replace(), você também pode excluir completamente a string como argumento para substituir e descobrirá o mesmo efeito.

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

Substituindo Múltiplas Instâncias

Assim como o método replace(), você também pode encadear o uso do operador replace. Como o operador replace retorna uma string, como mostrado abaixo. Você verá na próxima seção que seu código ficará mais limpo usando regex.

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

Usando PowerShell Regex Replace

Conforme mencionado acima, a substituição de strings no método de substituição do PowerShell funciona, mas é limitada. Você está restrito a usar apenas strings literais. Não é possível usar curingas ou regex. Se você estiver realizando algum tipo de substituição intermediária ou avançada, deverá usar o operador replace.

Digamos que você tenha um script que contenha uma string criada com uma variável. Essa string deve ser hello, world ou hi, world.. Talvez você tenha tido um dia ruim como sysadmin e queira alterar a string, independentemente do valor, para goodbye, world.

Você precisa que hello, world e hi, world se transformem em goodbye, world. Para fazer isso, você precisa usar uma expressão regular. Você pode corresponder a praticamente qualquer padrão específico no texto com regex.

Neste exemplo, você pode usar a expressão hello|hi para corresponder a ambas as strings necessárias usando o regex caractere “ou” (|), como pode ser visto abaixo.

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

Depois de aprender a manusear regex para encontrar strings, você pode usar o PowerShell para substituir strings curinga que correspondam a qualquer padrão.

Escapando Caracteres Regex

No exemplo de regex acima, a string na qual buscar não continha nenhum caracteres especiais de regex. A linguagem de expressão regular tem certos caracteres que são usados que não são interpretados literalmente como a maioria das letras e números.

Por exemplo, talvez você precise substituir texto em uma string. Essa string contém alguns caracteres especiais de regex como um colchete e um ponto de interrogação. Você então tenta substituir a string [hello] por adeus como mostrado abaixo.

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

Claramente, isso não é o que você pretendia. Esse cenário acontece quando você usa caracteres especiais de regex dentro da string para encontrar ([hello]).

Para evitar esse problema, você tem duas opções. Você pode escapar esses caracteres especiais adicionando uma barra invertida na frente de cada caractere ou usar o método Escape().

Abaixo você pode ver o efeito de escapar cada caractere especial com uma barra invertida.

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

Alternativamente, e recomendado, você pode usar o método Escape() do tipo regex para remover automaticamente todos os caracteres especiais.

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

Você deve usar o método Escape() sempre que possível porque ele escapará todos os caracteres especiais para que você não precise lembrá-los.

Usando Grupos de Correspondência/Captura

Em todos os exemplos anteriores, este tutorial tem usado uma string literal para substituir outra string. Você tem usado `hi` ou `goodbye`. Mas e se você quiser usar um ou mais caracteres que o PowerShell encontrou na string para substituir? Você precisará corresponder ou capturar grupos.

Regex tem um conceito chamado grupos de captura e referências posteriores. Grupos de captura permitem que você capture strings para referenciá-las em outro lugar. O PowerShell aproveita esse recurso usando grupos de correspondência com o operador `replace`.

Por exemplo, talvez você tenha uma string que possa conter alguns valores diferentes.

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

Você gostaria de trocar a primeira parte da string pela segunda parte, fazendo-as parecer assim:

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

Para realizar essa ação, o PowerShell deve encontrar todo o texto à direita e à esquerda da vírgula. Uma vez que ele saiba qual é esse texto, ele deve então substituir um pelo outro. Para fazer isso, você precisa de referências posteriores.

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.

Você pode ver um exemplo abaixo.

## Esta string também poderia ser:
## 'hi, mundo, agora vá embora'
## 'olá, terra, você está adorável hoje'
PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(.*), (.*)','$2,$1'
you sexy beast,hello world

No exemplo acima, você pode ver grupos de captura de regex envolvendo cada correspondência (hello world) e (you sexy beast) com parênteses. Em seguida, para a substituição, hello word foi correspondido primeiro da esquerda para a direita, então ele recebe uma etiqueta de referência de volta $1 e you sexy beast recebe uma etiqueta de referência de volta $2.

Assim que o PowerShell conhece o valor de cada correspondência, você pode usar essas referências no texto substituído da maneira que desejar. Neste exemplo, $2,$1 troca suas posições.

Usando Grupos de Correspondência Nomeados

Se você preferir não usar espaços reservados numerados como $1, $2 para referenciar valores correspondentes, você também pode usar rótulos ou nomes. Em vez de ter que contar da esquerda para a direita quais referências significam o quê, você pode simplesmente usar nomes.

Para usar nomes como referências, você precisa primeiro definir rótulos para cada correspondência na string de correspondência. Para fazer isso, você deve definir o grupo de captura como (?<label><regex>), onde label é o nome e <regex> é a expressão regular que você está usando.

Assim que você definiu os nomes, pode então referenciá-los na string de substituição usando um sinal de dólar e cercando o nome entre chaves, por exemplo, ${label}.

Você pode ver uma demonstração dessa técnica abaixo.

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

Conclusão

Como você aprendeu, o operador de substituição do PowerShell permite substituir caracteres, texto e strings de várias maneiras diferentes. Para realizar substituições simples, você pode usar o método replace(), mas se precisar fazer correspondências e substituir algo mais avançado, sempre use o operador replace.

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