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
.
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
.
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.
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.
Você pode encadear quantas chamadas de método
replace()
forem necessárias, mas você deve considerar usar o operadorreplace
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.
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.
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.
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.
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.
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.
Alternativamente, e recomendado, você pode usar o método Escape()
do tipo regex para remover automaticamente todos os caracteres especiais.
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.
Você gostaria de trocar a primeira parte da string pela segunda parte, fazendo-as parecer assim:
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.
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.
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
.