Como Usar o PowerShell Replace 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ê aprenderá como usar o método replace() do PowerShell e o operador replace do PowerShell. O tutorial abordará o básico e até mesmo se aprofundará em algumas expressões regulares “divertidas”!

Antes de começar

Você não precisará de muito para acompanhar todos os exemplos deste tutorial; você só precisará do PowerShell. Este tutorial usará o 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 uso de PowerShell replace é substituir caracteres em strings. Vamos começar com alguns exemplos.

Vamos dizer que você tenha uma string no PowerShell com o valor olá, mundo.

$string = 'hello, world'

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

Usando o Método Replace()

Uma das maneiras mais fáceis de substituir strings no PowerShell é usar o método de comando replace, conforme mostrado abaixo. O método replace() tem 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 de uma string em vez de substituí-los por outra coisa. 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.

Como 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 você deve considerar usar o operador replace se tiver muitas strings para substituir.

Usando o Operador Replace do PowerShell

Embora usar o método de string replace 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. Mas, ele tem uma grande vantagem; a capacidade de usar expressões regulares (regex) para encontrar strings correspondentes (mais tarde).

Usando o exemplo acima, você pode usar o operador replace para substituir hello por hi de forma 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. Mas, ao contrário do método replace(), você também pode excluir completamente a string como um 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 será mais limpo usando regex.

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

Usando PowerShell Regex Replace

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

Vamos dizer que você tenha um script que contenha uma string criada com uma variável. Essa string deve ser ou 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 sejam transformados em goodbye, world. Para fazer isso acontecer, você precisa usar uma expressão regular. Você pode corresponder a praticamente qualquer padrão específico de 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 você pode ver abaixo.

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

Depois de aprender como usar 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 procurar não continha nenhum caracteres especiais de regex. A linguagem de expressão regular possui certos caracteres que não são interpretados literalmente, ao contrário da 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 goodbye, como mostrado abaixo.

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

Isso claramente não é o que você pretendia. Esse cenário ocorre quando você usa caracteres especiais de regex dentro da string a ser encontrada ([hello]).

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

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, pois ele escapará todos os caracteres especiais para que você não precise lembrar deles.

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.

O Regex tem um conceito chamado grupos de captura e referências posteriores. Os grupos de captura permitem que você capture strings para depois 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 esta ação, o PowerShell deve encontrar todo o texto à direita e à esquerda da vírgula. Uma vez que sabe 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, world, 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 regex envolvendo cada correspondência (`hello world`) e (`you sexy beast`) com parênteses. Então, 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`.

Uma vez que o PowerShell conhece o valor para cada correspondência, você pode usar essas referências no texto substituído de qualquer maneira que você quiser. Neste exemplo `$2,$1` troca suas posições.

Usando Grupos de Correspondência Nomeados

Se você preferir não usar marcadores de número como `$1`, `$2` para referenciar valores de correspondência, você pode usar rótulos ou nomes também. 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 `(?

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

Você pode ver uma demonstração desta 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 que você substitua caracteres, texto e strings de muitas maneiras diferentes. Para realizar substituições simples, você pode usar o método replace(), mas se precisar fazer substituições mais avançadas, sempre use o operador replace.

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