Magic Quadrant™ para la gestión de acceso privilegiado 2025: Netwrix reconocida por cuarto año consecutivo. Descarga el informe.

Plataforma
Centro de recursosBlog
Guía para principiantes sobre técnicas de reemplazo de cadenas en PowerShell

Guía para principiantes sobre técnicas de reemplazo de cadenas en PowerShell

Apr 3, 2025

PowerShell permite un reemplazo de cadenas eficiente con dos métodos: el método Replace() para sustituciones exactas y sensibles a mayúsculas y minúsculas y el operador -replace para coincidencias de patrones basadas en regex y no sensibles a mayúsculas y minúsculas. Estas herramientas apoyan tareas desde limpiar archivos de configuración hasta transformar conjuntos de datos masivos. Al dominar ambos enfoques, los equipos de TI pueden automatizar la manipulación de texto, hacer cumplir los estándares de datos y optimizar la gestión de archivos.

PowerShell Replace String

Ser capaz de encontrar y reemplazar texto específico dentro de cadenas es útil para muchas tareas, incluyendo el procesamiento de datos, la automatización y la gestión de archivos. Por ejemplo, reemplazar información obsoleta con datos actuales es importante para la estandarización de datos.

PowerShell ofrece dos métodos principales para el reemplazo de cadenas:

  • Replace() — Este es un método sencillo para reemplazar subcadenas exactas dentro de una cadena. Es sensible a mayúsculas y minúsculas y no admite expresiones regulares (regex). Úselo para reemplazos de texto simples donde se conoce la cadena exacta.
  • -operador de reemplazo — Esta es una opción más potente que soporta expresiones regulares (regex), permitiendo emparejamientos de patrones complejos y reemplazos. Úsalo para manipulación avanzada de texto, como reemplazar patrones o utilizar grupos de captura.

Por ejemplo, supongamos que queremos reemplazar la cadena “Hello” por “Hi.” Aquí hay un script para lograr esto utilizando el método Replace():

      $string = "Hello World!"$newString = $string.Replace("Hello", "Hi")Write-Output $newString  # Output: Hi World!And here is an alternative script that uses the -replace operator:$string = "Hello, World!"$newString = $string -replace "Hello", "Hi"Write-Output $newString  # Output: Hi, World!
      

Métodos de reemplazo en PowerShell: Una comparación rápida

Para determinar cuál método de reemplazo de PowerShell es mejor para un caso de uso dado, considere las siguientes características de cada uno.

Método Replace()

  • Requiere una coincidencia exacta
  • No admite expresiones regulares
  • Es sensible a mayúsculas y minúsculas

Por lo tanto, el método Replace() es el más adecuado para reemplazos de texto simples y exactos donde la sensibilidad al caso es importante.

-replace Operator

  • Admite expresiones regulares para la coincidencia de patrones
  • Es insensible a mayúsculas y minúsculas por defecto

Por lo tanto, se utiliza el operador -replace para el emparejamiento de patrones avanzado mediante expresiones regulares.

A continuación se presenta una tabla que resume las capacidades de cada método:

Sintaxis

$string.Replace(“old”, “new”)

$string -replace “old”, “new”

Sensibilidad a mayúsculas y minúsculas

Sensible a mayúsculas y minúsculas

Sensible a mayúsculas y minúsculas (por defecto)

Soporte de expresiones regulares

No

Casos de uso

Reemplazos literales de cadena simples

Coincidencia de patrones complejos, manipulación dinámica de texto

Los fundamentos: Reemplazar caracteres y palabras en cadenas

Usando el método Replace()

En el ejemplo anterior, reemplazamos una palabra en una cadena utilizando el método Replace() como se muestra aquí:

      $string = "Hello, World!"$newString = $string.Replace("Hello", "Hi")Write-Output $newString  # Output: Hi, World!
      

También puedes utilizar el método Replace() para eliminar caracteres de una cadena reemplazándolos con una cadena vacía:

      $string = "Hello, World!"$newString = $string.Replace("World", "")Write-Output $newString  # Output: Hello, !
      

Usando el operador -replace

El operador -replace ofrece más flexibilidad que el método Replace(), especialmente al tratar con patrones complejos o reemplazos que no distinguen entre mayúsculas y minúsculas. Por ejemplo, el siguiente script coincidirá con la cadena “hello” independientemente de su caso:

      $string = "Hello, World!"$newString = $string -replace "hello", "Hi"Write-Output $newString  # Output: Hi, World!If you want the matching to be case sensitive, use the PowerShell -creplace operator instead of ?replace:$string = "Hello, World!"$newString = $string -creplace "hello", "Hi"Write-Output $newString  # Output: Hello, World! (no change)
      

Eliminando cadenas o caracteres

Eliminar caracteres específicos o subcadenas de textos es una tarea común en el procesamiento de texto, limpieza de datos, eliminación de información obsoleta de archivos de configuración y mejora de la legibilidad o compatibilidad del texto.

Para eliminar un carácter o subcadena utilizando el método Replace(), simplemente reemplace el texto especificado con una cadena vacía (“”). Por ejemplo, supongamos que tienes una lista de direcciones de correo electrónico y necesitas eliminar el nombre de dominio para extraer solo los nombres de usuario:

      $email = "user@example.com"$cleanEmail = $email.Replace("@example.com", "")Write-Output $cleanEmail  # Output: user
      

Usando PowerShell Replace con Expresiones Regulares (Regex)

Una expresión regular es una secuencia de caracteres que define un patrón de búsqueda utilizado para coincidir, validar o extraer datos de cadenas. El patrón puede incluir caracteres literales, caracteres especiales y cuantificadores.

Regex también te permite agrupar partes de un patrón utilizando paréntesis. Estos grupos pueden ser referenciados más adelante en el patrón o en la cadena de reemplazo.

Aquí hay algunos de los caracteres especiales que se pueden usar en un patrón de regex:

  • El punto (.) coincide con cualquier carácter individual.
  • El asterisco (*) coincide con cero o más ocurrencias del elemento anterior.
  • El signo más (+) coincide con una o más ocurrencias.
  • El signo de interrogación (?) hace que el elemento anterior sea opcional.
  • {n} coincide exactamente con n ocurrencias.
  • {n,} coincide al menos con n ocurrencias.

En este script, el carácter especial punto en la cadena “.test” asegura una coincidencia en las tres cadenas de entrada:

      $string = "Atest, btest, ctest"$matches = [regex]::Matches($string, ".test")foreach ($match in $matches) {    Write-Output $match.Value}# Output:# Atest# btest# ctest
      

Aquí hay un ejemplo utilizando el asterisco (*) para coincidir con cero o más ocurrencias del elemento anterior ("ab"):

      $string = "a, ab, abb, abbb"$matches = [regex]::Matches($string, "ab*")foreach ($match in $matches) {    Write-Output $match.Value}# Output:# ab# abb# abbb
      

Aquí hay más ejemplos de patrones regex comunes para PowerShell:

  • Coincidir con cualquier dígito: \d
  • Coincidir con cualquier carácter que no sea un dígito: \D
  • Coincidir con cualquier espacio en blanco: \s
  • Coincidir con cualquier carácter que no sea un espacio en blanco: \S
  • Coincidir con cualquier carácter de palabra: \w
  • Coincidir con cualquier carácter que no sea una palabra: \W
  • Coincide con “a” o “b”: a|b
  • Coincidir con cualquier carácter entre corchetes: [abc]
  • Coincidir con cualquier carácter que no esté entre corchetes: [^abc]

A continuación se muestra un script que utiliza \d para reemplazar cada dígito con un símbolo de numeral (#):

      $string = "Hello123World456"$newString = $string -replace "\d", "#"Write-Output $newString  # Output: Hello###World###
      

Trabajando con archivos: Reemplazar cadenas en archivos

Puedes usar PowerShell para reemplazar cadenas en un archivo único o múltiples archivos. Esto resulta útil para tareas como actualizar configuraciones o archivos de registro.

Reemplazar texto en un solo archivo

Para reemplazar texto en un solo archivo, puedes utilizar los cmdlets Get-Content y Set-Content. Por ejemplo, este script lee un archivo de configuración, reemplaza las ocurrencias de “OldValue” por “NewValue” y guarda los cambios:

      $file = "C:\Configs\settings.txt"(Get-Content $file) -replace "OldValue", "NewValue" | Set-Content $file# Write the updated content back to the file$updatedContent | Set-Content -Path "C:\config.txt"
      

Reemplazar texto en múltiples archivos

Si necesita reemplazar texto en múltiples archivos, utilice Get-ChildItem para buscar archivos de manera recursiva y luego aplique el reemplazo usando Get-Content y Set-Content. Este script busca todos los archivos .txt en C:\Logs\ y reemplaza “Error” por “Warning”:

      Get-ChildItem -Path "C:\Logs\" -Filter "*.txt" -Recurse |ForEach-Object {    (Get-Content $_.FullName) -replace "Error", "Warning" | Set-Content $_.FullName}
      

Aquí hay algunos consejos para mejorar el rendimiento al trabajar con conjuntos de datos grandes:

  • En lugar de cargar todo el archivo en la memoria de una vez, use Get-Content con -ReadCount para cargarlo en lotes.
  • Evita bucles innecesarios.
  • Utilice cmdlets nativos de PowerShell.

Para archivos extremadamente grandes, es posible que desee considerar herramientas de terceros que ofrecen un rendimiento más rápido que los scripts de PowerShell.

Técnicas avanzadas: Reemplazos condicionales y en masa

Reemplazo condicional

La sustitución condicional te permite reemplazar cadenas solo si se cumple una condición determinada. Esto se puede hacer utilizando declaraciones if-else o bloques de script. Por ejemplo, el script a continuación reemplaza “old” por “new” solo si la cadena contiene “specific”:

      $string = "This is old and specific."if ($string -match "specific") {    $newString = $string -replace "old", "new"} else {    $newString = $string}Write-Output $newString  # Output: This is new and specific.
      

Reemplazo masivo

La sustitución masiva implica reemplazar múltiples cadenas en una sola operación. Por ejemplo, en lugar de ejecutar varios comandos de reemplazo por separado, este script utiliza una tabla hash para reemplazar eficientemente múltiples valores en una sola operación:

      $replacements = @{    "old1" = "new1"    "old2" = "new2"    "old3" = "new3"}$string = "This contains old1, old2, and old3."foreach ($key in $replacements.Keys) {    $string = $string -replace $key, $replacements[$key]}Write-Output $string  # Output: This contains new1, new2, and new3.
      

Encadenando métodos de reemplazo

Para transformaciones complejas de texto, se pueden encadenar múltiples métodos -replace o Replace(). A continuación se muestra un script sencillo que encadena instancias del operador -replace para realizar múltiples reemplazos en una cadena:

      $string = "This is old1, old2, and old3."$newString = $string -replace "old1", "new1" -replace "old2", "new2" -replace "old3", "new3"Write-Output $newString  # Output: This is new1, new2, and new3.And here is another example that chains uses of the Replace() method:$string = "This contains old1, old2, and old3."$newString = $string.Replace("old1", "new1").Replace("old2", "new2").Replace("old3", "new3")Write-Output $newString  # Output: This contains new1, new2, and new3.
      

Tutorial de Windows PowerShell Scripting (PDF) para Principiantes

Aprende más

Conclusión

Ya sea que necesite procesar archivos de configuración, transformar la salida de datos o modificar texto en múltiples archivos, las capacidades de reemplazo de cadenas de PowerShell ofrecen una flexibilidad y eficiencia sin igual. De hecho, el operador -replace y el método Replace() permiten una automatización que va mucho más allá de las operaciones básicas de buscar y reemplazar. Dominarlos, junto con la funcionalidad de expresiones regulares, le ayudará a manejar sin problemas la infraestructura y los conjuntos de datos cada vez más complejos de su organización.

Preguntas frecuentes

¿Por qué no funciona mi reemplazo de cadena en PowerShell?

El problema más común es la confusión entre el método Replace() y el operador -replace – manejan la sensibilidad a mayúsculas y minúsculas de manera diferente. El método Replace() es sensible a mayúsculas y minúsculas por defecto, así que esto no funcionará:

      "Hello".Replace("hello", "Hi")
      

Utilice la coincidencia de mayúsculas y minúsculas exacta:

      "Hello".Replace("Hello", "Hi")
      

O cambie al operador -replace que no distingue entre mayúsculas y minúsculas:

      "Hello" -replace "hello", "Hi"
      

Los caracteres especiales también causan problemas porque tienen significado en las expresiones regulares. El operador -replace utiliza patrones regex, por lo que caracteres como $, \, ., y * necesitan ser escapados. Si estás intentando reemplazar un signo de dólar literal:

      "Price: $100" -replace '\$', '£'
      

Para reemplazos literales simples sin la complejidad de las expresiones regulares, manténgase con el método Replace().

Otra trampa es olvidar que las operaciones de cadena en PowerShell no modifican la cadena original, sino que devuelven una nueva cadena. Siempre asigne el resultado a una variable:

      $result = $originalString -replace "old", "new"
      

Si solo ejecutas el comando replace sin asignación, verás el resultado pero la variable original permanecerá sin cambios.

¿Cuándo debo usar el método Replace() en lugar del operador -replace?

Utilice el método Replace() para reemplazos de texto literales simples donde conozca el texto exacto a reemplazar. Es más rápido para operaciones básicas y no interpreta caracteres especiales como patrones de regex. Este método es perfecto para sustituciones sencillas como reemplazar extensiones de archivo, corregir errores tipográficos o intercambiar palabras específicas:

      $filename.Replace(".txt", ".log")
      

Elija el operador -replace cuando necesite coincidencia de patrones, reemplazos insensibles a mayúsculas y minúsculas o manipulación compleja de texto. Admite expresiones regulares, lo que lo hace poderoso para escenarios avanzados como eliminar múltiples caracteres de espacio en blanco, coincidir patrones o usar grupos de captura. El operador destaca cuando necesita flexibilidad:

      # Replace multiple spaces with single spaces
$text -replace '\s+', ' '
      

El rendimiento también importa. Para operaciones a gran escala, el método Replace() suele ser más rápido porque no procesa patrones regex. Sin embargo, el operador -replace te brinda más control y flexibilidad. En entornos empresariales donde estás procesando registros, archivos de configuración o operaciones de datos en masa, las capacidades de coincidencia de patrones de -replace a menudo compensan la diferencia de rendimiento.

¿Cómo reemplazas caracteres especiales en cadenas de PowerShell?

Los caracteres especiales requieren diferentes enfoques dependiendo del método de reemplazo que estés utilizando. Con el método Replace(), la mayoría de los caracteres especiales funcionan como literales:

      $text.Replace('$', 'USD')
      

Sin embargo, algunos caracteres como los caracteres nulos o los caracteres de control podrían requerir un manejo especial.

El operador -replace utiliza expresiones regulares, por lo que debes escapar los metacaracteres de regex. Los comunes incluyen $ (usa \$), . (usa \.), * (usa \*), + (usa \+), ? (usa \?), ^ (usa \^) y \ (usa \\). Por ejemplo:

      # Replace backslashes with forward slashes in file paths
$path -replace '\\', '/'
      

Para reemplazos complejos de caracteres, considere usar clases de caracteres o escapes Unicode. Reemplace cualquier carácter de espacio en blanco con \s, cualquier dígito con \d, o caracteres Unicode específicos con \u0041 para la letra A. Al tratar con entradas de usuario o datos no confiables, siempre valide y sane las cadenas antes de procesarlas – aquí es donde PowerShell se convierte en una herramienta de seguridad, no solo un procesador de texto.

¿Cómo reemplazas varias cadenas a la vez en PowerShell?

Encadene múltiples operaciones de -replace para casos simples:

      $text -replace "old1", "new1" -replace "old2", "new2"
      

Este enfoque es legible y funciona bien para algunos reemplazos, pero se vuelve engorroso con muchas sustituciones. Cada operación procesa la cadena de texto de manera secuencial, por lo que el orden importa si los reemplazos podrían entrar en conflicto.

Para escenarios más complejos, utilice una tabla hash con un bucle foreach. Cree una tabla hash que asocie valores antiguos con nuevos valores, luego itere a través de ella:

      $replacements = @{"old1"="new1"; "old2"="new2"}
$result = $text
$replacements.GetEnumerator() | ForEach-Object {
    $result = $result -replace $_.Key, $_.Value
}
      

Este enfoque escala mejor y mantiene tu lógica de reemplazo organizada.

Para reemplazos masivos de alto rendimiento, considere usar el operador -replace con alternancia regex: $text -replace "(old1|old2|old3)", { switch($_.Value) { "old1" {"new1"} "old2" {"new2"} "old3" {"new3"} } }. Esto procesa la cadena una sola vez mientras maneja múltiples patrones. La clave es adaptar su enfoque al volumen y complejidad de los datos requeridos.

¿Puede PowerShell reemplazar operaciones modificar cadenas originales?

No, las operaciones de reemplazo de cadenas en PowerShell nunca modifican el objeto de cadena original – las cadenas son inmutables en .NET. Tanto el método Replace() como el operador -replace devuelven un nuevo objeto de cadena con los cambios aplicados. La cadena original permanece sin cambios a menos que explícitamente asigne el resultado de nuevo a la misma variable.

Este comportamiento previene la corrupción accidental de datos pero puede confundir a los principiantes. Cuando ejecutas:

      $name.Replace("John", "Jane")
      

La variable original $name todavía contiene “John” a menos que la reasignes:

      $name = $name.Replace("John", "Jane")
      

Esta inmutabilidad es en realidad una característica de seguridad: impide que las funciones modifiquen tus datos de manera inesperada.

Comprender este concepto es crucial para la fiabilidad del script y la integridad de los datos. Siempre asigne los resultados de la sustitución a variables cuando necesite mantener los cambios:

      $cleanedData = $rawData -replace "[^a-zA-Z0-9]", ""
      

En entornos empresariales, este comportamiento predecible ayuda a garantizar que las operaciones de registro, auditoría y procesamiento de datos no corrompan accidentalmente los datos de origen al transformarlos para diferentes propósitos.

Compartir en

Aprende más

Acerca del autor

Asset Not Found

Jonathan Blackwell

Jefe de Desarrollo de Software

Desde 2012, Jonathan Blackwell, un ingeniero e innovador, ha proporcionado liderazgo en ingeniería que ha colocado a Netwrix GroupID a la vanguardia de la gestión de grupos y usuarios para entornos de Active Directory y Azure AD. Su experiencia en desarrollo, marketing y ventas permite a Jonathan comprender completamente el mercado de Identity Management y la forma de pensar de los compradores.