Expresiones regulares en PowerShell

Para los que piensan en que situación vamos a depender de usar o no expresiones regulares en PowerShell, los invito a seguir leyendo el post ya que vamos a ver varios prácticos que se resuelven utilizando expresiones regulares. Por más que parezca un tema complejo vamos a ver que a medida que empezamos a utilizarlas el camino es más sencillo.

Buscar información

Sobre algunos casos es necesario buscar cierta información, la cual cumple ciertos patrones. En PowerShell tenemos el operador -match que podemos utilizar como muestra el siguiente ejemplo:

En nuestra empresa nombramos nuestros servidores comenzando con SRV y continuando con algunas letras que determinen el rol del servidor y 2 número al final: “SRVEXCH01”, puede ser un caso de servidor. Para encontrar nombres de servidores dentro de un texto en particular, vamos a definir el siguiente patrón:

$pattern = ‘SRV[A-Z]{2,4}\d{2}’

Vamos a desglosar esta expresión para comprender mejor como trabaja:

SRV: Cumple mi primera condición de nomenclatura en donde todos mis servidores comienzan con SRV.

[A-Z]{2-4}: Continuando con mi nomenclatura el nombre del servidor debe contener información del rol que contiene y esta información no debe pasar los 4 caracteres (todos en mayúscula).

– \d{2}: Al final del nombre debe contener un número de 2 dígitos.

Ahora que tenemos el patrón vamos a probar diferentes ejemplos de textos que contienen nombres de servidores que cumplen con el patrón y otros no:

$text = 'El nombre del controlador de dominio es SRVDC01 y el servidor de DHCP es SRVDHCP03.'
$pattern = 'SRV[A-Z]{2,4}\d{2}'
$text -match $pattern

Considerando el código anterior se deja en evidencia el uso del operador -match para comprobar si se encontraban coincidencias con respecto al patrón de búsqueda. Ésta expresión devuelve resultados booleanos ($true o $false). Debido a que el ejemplo que utilizamos devuelve $true, podemos observar el resultado de esa evaluación accediendo a una variable automática llamada $matches:

Donde podemos armar algo más estructurado como lo siguiente: if ($text -match $pattern) { $matches[0] } ### Patrones Me gustaría compartir algunos ejemplos de patrones según el tipo de búsqueda: ## Multiples caracteres $text = 'Mi nombre es James Bond' $pattern = 'Jame[^abc]' $text -match $pattern #Resultado: $true El resultado es true, ya que mi patrón excluye las letras _a_, _b_ y _c_ como último caracter (James no termina con ninguna de esas letras). ## Según la posición $text = 'PowerShell es lo peor' $text -replace 'peor$','mejor' #Resultado: PowerShell es lo mejor Utilizamos el signo **$** para indicar que valide el patrón si se encuentra al final de la línea. ### Select-String Pero tenemos un inconveniente, que capaz no lo notaron; el resultado solamente devolvió uno de los dos nombres que coincidían, ya que -match solamente devuelve el primer valor verdadero. ¿Que sucede con los casos en donde necesitamos obtener todos los resultados que cumplen con el expresión? En estos casos vamos a utilizar el cmdlet **_Select-String_**. Para usar el cmdlet anterio debemos asignar el pattern al parámetro **_-AllMatches_** y expandir las propiedades como ejemplifica la siguiente línea: $text | Select-String -AllMatches $pattern | select -ExpandProperty Matches | select -ExpandProperty Value Saludos,

Comments