Cómo usar PowerShell Replace para reemplazar texto [Ejemplos]

Como muchos otros lenguajes, PowerShell puede trabajar con cadenas de texto. Una de esas características útiles es la capacidad de utilizar PowerShell para reemplazar caracteres, cadenas o incluso texto dentro de archivos.

En este tutorial, aprenderás cómo utilizar el método replace() y el operador replace de PowerShell. El tutorial cubrirá lo básico e incluso se sumergirá en algunas expresiones regulares “divertidas”.

Antes de empezar

No necesitarás mucho para seguir todos los ejemplos en este tutorial; solo necesitarás PowerShell. Este tutorial utiliza PowerShell v7.0.2, pero todos los ejemplos deberían funcionar en Windows PowerShell.

Uso de PowerShell para reemplazar cadenas: Lo básico

Uno de los casos más simples de uso de PowerShell para reemplazar es sustituir caracteres en cadenas. Comencemos con algunos ejemplos.

Supongamos que tienes una cadena en PowerShell con un valor de hola, mundo.

$string = 'hello, world'

Te gustaría reemplazar la cadena hola, dentro de esa cadena, con la cadena hola para que la variable $cadena tenga un valor de hi, mundo. Para lograrlo, PowerShell primero debe determinar dónde está el texto a “encontrar”. Una vez encontrado, reemplaza ese texto con un valor definido por el usuario.

Usando el Método `Replace()`

Una de las formas más sencillas de reemplazar cadenas en PowerShell es mediante el método de comando `replace`, como se muestra a continuación. El método `replace()` tiene dos argumentos; la cadena a encontrar y la cadena con la que se va a reemplazar el texto encontrado.

Como puedes ver a continuación, PowerShell está encontrando la cadena `hello` y reemplazando esa cadena con la cadena `hi`. Luego, el método devuelve el resultado final que es `hi, mundo`.

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

Puedes llamar al método de reemplazo de PowerShell en cualquier cadena para reemplazar cualquier cadena literal por otra. Si la cadena a reemplazar no se encuentra, el método `replace()` no devuelve nada.

No necesitas asignar una cadena a una variable para reemplazar texto en una cadena. En cambio, puedes invocar el método `replace()` directamente en la cadena como: `'hello world'.replace('hello','hi')`. El tutorial está utilizando una variable por conveniencia.

Eliminando Caracteres

Quizás quieras eliminar caracteres en una cadena de otra cadena en lugar de reemplazarlos por otra cosa. También puedes hacer eso especificando una cadena vacía.

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

Reemplazando Múltiples Instancias

Ahora tienes el código para reemplazar una cadena dentro de otra cadena. ¿Qué tal si quieres reemplazar múltiples cadenas? No hay problema.

Dado que el método de reemplazo de PowerShell devuelve una cadena, para reemplazar otra instancia, puedes agregar otra llamada al método `replace()` al final. PowerShell luego invoca el método `replace()` en la salida del original.

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

Puedes encadenar tantas llamadas al método replace() como sea necesario, pero deberías considerar utilizar el operador replace si tienes muchas cadenas para reemplazar.

Uso del Operador de Reemplazo de PowerShell

Aunque usar el método de cadena de reemplazo de PowerShell es la forma más sencilla de reemplazar texto, también puedes utilizar el operador replace de PowerShell. El operador replace es similar al método en el sentido de que proporcionas una cadena para buscar y reemplazar. Sin embargo, tiene una gran ventaja: la capacidad de utilizar expresiones regulares (regex) para encontrar coincidencias (más adelante).

Usando el ejemplo anterior, puedes utilizar el operador replace para reemplazar hello con hi de manera similar a como se muestra a continuación. PowerShell realiza los mismos pasos.

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

Eliminación de Caracteres

Al igual que el método de reemplazo de PowerShell, también puedes eliminar caracteres de una cadena usando el operador replace. Pero, a diferencia del método replace(), también puedes excluir completamente la cadena como argumento para reemplazar y obtendrás el mismo efecto.

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

Reemplazo de Múltiples Instancias

Al igual que el método replace(), también puedes encadenar el uso del operador replace. Dado que el operador replace devuelve una cadena como se muestra a continuación. Verás en la siguiente sección que tu código será más limpio usando expresiones regulares.

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

Usando PowerShell Regex Replace

Como se mencionó anteriormente, funciona reemplazar cadenas en el método replace de PowerShell, pero está limitado. Estás obligado a usar solo cadenas literales. No puedes usar comodines o regex. Si estás realizando algún tipo de reemplazo intermedio o avanzado, deberías usar el operador replace.

Digamos que tienes un script que contiene una cadena que se crea con una variable. Esa cadena debería ser hola, mundo o hola, mundo. Tal vez has tenido un mal día como administrador de sistemas y quieres cambiar la cadena, independientemente del valor, a adiós, mundo.

Necesitas que tanto hola, mundo como hi, world se transformen en adiós, mundo. Para que esto ocurra, necesitas usar una expresión regular. Puedes hacer coincidir casi cualquier patrón específico en el texto con regex.

En este ejemplo, puedes usar la expresión hola|hi para hacer coincidir ambas cadenas requeridas usando el regex carácter “o” (|) como puedes ver a continuación.

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

Una vez que aprendas a usar regex para encontrar cadenas, puedes usar PowerShell para reemplazar cadenas de comodines que coincidan con cualquier patrón.

Escapando caracteres de Regex

En el ejemplo de regex anterior, la cadena en la que buscar no contenía ningún caracter especial de regex. El lenguaje de expresiones regulares tiene ciertos caracteres que utiliza y que no se interpretan literalmente como la mayoría de las letras y números.

Por ejemplo, tal vez necesites reemplazar texto en una cadena. Esa cadena contiene algunos caracteres especiales de regex, como un corchete y un signo de interrogación. Luego intentas reemplazar la cadena [hello] con goodbye, como se muestra a continuación.

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

Eso claramente no es lo que pretendías. Este escenario ocurre cuando usas caracteres especiales de regex dentro de la cadena a buscar ([hello]).

Para evitar este problema, tienes dos opciones. Puedes escapar estos caracteres especiales anteponiendo una barra invertida al frente de cada caracter o usar el Escape() método.

A continuación, puedes ver el efecto de escapar cada carácter especial con una barra invertida.

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

Como alternativa, y recomendado, puedes usar el método Escape() del tipo regex para eliminar automáticamente todos los caracteres especiales.

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

Deberías usar el método Escape() siempre que sea posible porque escapará todos los caracteres especiales, por lo que no tendrás que recordarlos.

Uso de Grupos de Coincidencia/Captura

En todos los ejemplos anteriores, este tutorial ha estado utilizando una cadena literal para reemplazar otra cadena. Has estado usando hi o goodbye. Pero ¿qué pasa si quieres usar uno o más caracteres que PowerShell encontró en la cadena para reemplazarlos? Necesitarás hacer coincidir o utilizar grupos de captura.

Regex tiene un concepto llamado grupos de captura y referencias posteriores. Los grupos de captura te permiten capturar cadenas para luego referenciarlas en otros lugares. PowerShell aprovecha esta característica usando grupos de coincidencia con el operador replace.

Por ejemplo, quizás tengas una cadena que pueda contener varios valores.

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

Te gustaría intercambiar la primera parte de la cadena con la segunda parte, haciéndolas verse así:

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

Para realizar esta acción, PowerShell debe encontrar todo el texto a la derecha y a la izquierda de la coma. Una vez que sabe cuál es ese texto, debe reemplazar uno con el otro. Para hacer eso, necesitas referencias 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.

Puedes ver un ejemplo a continuación.

## Esta cadena también podría ser:
## 'hi, mundo, ahora vete'
## 'hola, tierra, eres encantadora hoy'
PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(.*), (.*)','$2,$1'
you sexy beast,hello world

En el ejemplo anterior, puedes ver grupos de captura de regex rodeando cada coincidencia (hello world) y (you sexy beast) con paréntesis. Luego, para la sustitución, hello world fue la primera coincidencia de izquierda a derecha, por lo que recibe la etiqueta de referencia $1, y you sexy beast recibe la etiqueta de referencia $2.

Una vez que PowerShell conoce el valor de cada coincidencia, puedes usar estas referencias en el texto reemplazado de la manera que desees. En este ejemplo, $2,$1 intercambia sus posiciones.

Utilizando Grupos de Coincidencia con Nombres

Si prefieres no utilizar marcadores numéricos como $1, $2 para referenciar los valores de coincidencia, también puedes usar etiquetas o nombres. En lugar de tener que contar de izquierda a derecha qué referencias significan qué, simplemente puedes usar nombres.

Para usar nombres como referencias, primero debes definir etiquetas para cada coincidencia en la cadena de coincidencia. Para hacer eso, debes definir el grupo de captura como (?<label><regex>), donde label es el nombre y <regex> es la expresión regular que estás utilizando.

Una vez que hayas definido los nombres, puedes referenciarlos en la cadena de reemplazo usando un signo de dólar y encerrando el nombre entre llaves, por ejemplo, ${label}.

Puedes ver una demostración de esta técnica a continuación.

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

Conclusión

Como has aprendido, el operador de reemplazo de PowerShell te permite sustituir caracteres, texto y cadenas de muchas maneras diferentes. Para realizar reemplazos simples, puedes utilizar el método replace(), pero si necesitas hacer coincidir y reemplazar algo más avanzado, siempre utiliza el operador replace.

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