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
.
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
.
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.
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.
Você pode encadear quantas chamadas de método
replace()
forem necessárias, mas deve considerar usar o operadorreplace
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.
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.
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.
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.
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.
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.
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 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.
Você gostaria de trocar a primeira parte da string pela segunda parte, fazendo-as parecer assim:
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.
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.
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
.