Búsqueda de sitios web

Cómo usar PowerShell Reemplazar para reemplazar una cadena o carácter


¿Necesita reemplazar una cadena o carácter en PowerShell? ¿O desea insertar bloques de texto completos en un archivo? Entonces la función de reemplazo en PowerShell es lo que estás buscando.

Con el método Reemplazar o el operador -replace en PowerShell, podemos buscar y reemplazar cualquier carácter o (parte de) cadenas con otros datos.

En este artículo, veremos los diferentes métodos para reemplazar una cadena en PowerShell y también le daré algunos ejemplos útiles en lo que respecta a la función de reemplazo.

Powershell reemplaza carácter en cadena

En PowerShell podemos usar el método Replace() en cualquier cadena o variable que sea una cadena. El método necesita dos argumentos, el texto o carácter que desea encontrar y con qué desea reemplazarlo.

La mejor manera de explicar la función Reemplazar de PowerShell es con ejemplos, así que comencemos con algunos ejemplos simples, como reemplazar un carácter o una palabra en una cadena.

Tomemos la siguiente cadena:

$str = "Welcome to LazyAdmin"

Para reemplazar la palabra to en at podemos usar el siguiente método:

$str = $str.Replace('to','at')

Guardé el resultado del método de reemplazo en la misma variable. No necesita usar variables para usar el método de reemplazo en PowerShell, también puede reemplazar directamente la cadena si lo desea.

"Welcome to LazyAdmin".Replace('to','at')

Otro ejemplo que uso a menudo es reemplazar las barras en la ruta de una carpeta:

$Paths = "folder\subfolder"
$Paths.replace('\','\\')

# Result
folder\\subfolder

Eliminar caracteres o palabras de una cadena

También podemos utilizar el método de reemplazo para eliminar palabras o caracteres de cadenas. Para hacer esto sólo necesitamos reemplazar el contenido con una cadena vacía, como esta:

# Replace the word 'to' with nothing
$str.Replace("to","")

Tomemos una lista de direcciones de correo electrónico y eliminemos el nombre de dominio y el símbolo @, de modo que solo nos queden los nombres de usuario. Vamos a recorrer la matriz con direcciones de correo y almacenar el resultado en $nombresdeusuario:

$mailAddresses = @("AdeleV@lazydev.com","GradyA@lazydev.com","JoniS@lazydev.com")
$usernames = @()

$mailAddresses | ForEach{
    $usernames += $_.Replace("@lazydev.com","")
}

# Result
AdeleV
GradyA
JoniS

Insertar texto en plantillas con Reemplazar

Algunos scripts que he creado envían un correo electrónico con información, por ejemplo, el nombre de usuario y la contraseña de un nuevo usuario, o una descripción general de todos los usuarios sin MFA habilitado.

Para esos correos electrónicos, he creado una plantilla de correo electrónico HTML y dentro de esta plantilla, he colocado marcadores de posición para el nombre de usuario y la contraseña.

<p>Hi {{manager.firstname}},</p>
<p>The account for {{user.fullname}} is ready. Below you will find the login credentials for {{user.firstname}}. The password is temporary and needs to be changed after the first login.</p>
  <p>
	  <table class="details">
		  <tr>
			  <td style="font-family:sans-serif;font-size:14px;">Username: </td>
			  <td style="color:#000000;"><strong>{{user.UserPrincipalName}}</strong></td>
		  </tr>
		  <tr>
			  <td style="font-family:sans-serif;font-size:14px;">Password: </td>
			  <td><strong>{{user.Password}}</strong></td>
		  </tr>
	  </table>
  </p>
<p>If you have any questions, please let us know</p>
<p>IT</p>

Como puede ver en la plantilla HTML, he creado marcadores de posición con llaves {{ }}. Con PowerShell podemos cargar el contenido del archivo HTML y usar reemplazar para reemplazar todos los marcadores de posición con el valor correcto:

#Get the mailtemplate
$mailTemplate = (Get-Content ($rootPath + '\' + $config.Settings.mailTemplateManager)) | ForEach-Object {
	$_ 	-replace '{{manager.firstname}}', $manager.GivenName `
	-replace '{{user.UserPrincipalName}}', $user.UserPrincipalname `
	-replace '{{user.Password}}', $config.Settings.password `
	-replace '{{user.fullname}}', $user.fullName `
	-replace '{{user.firstname}}', $user.givenName
} | Out-String	
		
return $mailTemplate

En este caso, he usado el operador -replace pero también puedes usar el método replace() para reemplazar múltiples instancias:

$str = "Welcome to LazyAdmin"
$str.Replace('Welcome','Hello').Replace('to ','')

# Result
Hello LazyAdmin

Powershell reemplaza expresiones regulares

Además del método Replace(), también tenemos el operador -replace. Básicamente, pueden hacer lo mismo, reemplazar cualquier carácter o palabra en una cadena por otra cosa. Pero hay una gran diferencia entre los dos: el operador -replace usa expresiones regulares para hacer coincidir la parte de búsqueda.

Nota

El operador -replace solo usa expresiones regulares para encontrar la palabra clave. No utiliza expresiones regulares en la parte de reemplazo del operador.

Tomemos el siguiente ejemplo: tengo una lista de archivos de registro cuyo nombre quiero cambiar de .log a .txt, por ejemplo.

Para hacer esto, podemos usar el operador -replace en PowerShell para seleccionar el .log del final de la cadena y reemplazarlo con .txt.

Get-ChildItem c:\temp\files | Rename-Item -NewName { $_.name -replace '\.log$','.txt' }

Ahora, en este caso también podríamos usar el método replace() porque .log es lo suficientemente único como para seleccionarlo y reemplazarlo. Pero si queremos eliminar el año del nombre del archivo, necesitaremos usar expresiones regulares para esto:

# Find 4 digits with \d{4}
Get-ChildItem c:\temp\files | Rename-Item -NewName { $_.name -replace '\d{4}','' }

Crear expresiones regulares siempre es un poco desafiante si no lo haces todos los días. Un buen sitio para probar sus expresiones es regex101.com.

Reemplazo que distingue entre mayúsculas y minúsculas

El operador -Replace no distingue entre mayúsculas y minúsculas de forma predeterminada. Puede distinguir entre mayúsculas y minúsculas utilizando el operador -creplace en lugar de -replace. Por ejemplo:

$str = "Hello LazyAdmin"

# Case insensitive
$str -replace 'hello', 'Goodbye';
# Result : Goodbye LazyAdmin

# Case sensitive
$str -creplace 'hello', 'Goodbye;
# Result : Hello LazyAdmin

Powershell reemplaza caracteres especiales

Con el operador de reemplazo en PowerShell podemos reemplazar fácilmente todos los caracteres especiales de una cadena. Regex nos permite seleccionar todos los caracteres que no sean palabras, todo excepto a-z, A-Z y 0-9, a otra cosa.

Por ejemplo:

$str = "Long [String] with _special@character#123$% and (spaces)'"
$str -replace ('\W', '')

# Result
LongStringwith_specialcharacter123andspaces

Si desea eliminar todos los caracteres especiales, excepto los espacios, entonces necesitamos usar una expresión regular ligeramente diferente:

$str = "Long [String] with _special@character#123$% and (spaces)'"
$str -replace ('[^a-zA-Z\d\s:]', '')

# Result
Long String with specialcharacter123 and spaces

Concluyendo

Reemplazar caracteres o palabras en una cadena con PowerShell se realiza fácilmente utilizando el método de reemplazo o el operador -replace. Cuando se trabaja con caracteres especiales, como los símbolos [ ],\o $, suele ser más fácil usar el método replace() que la variante del operador. Porque de esta manera no es necesario escapar del carácter especial.

Y tenga en cuenta que siempre pruebe su secuencia de comandos antes de ejecutarla con datos o archivos reales.

Si tiene alguna pregunta, simplemente deje un comentario a continuación.

Artículos relacionados