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:
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:
Patrones
Me gustaría compartir algunos ejemplos de patrones según el tipo de búsqueda:
Multiples caracteres
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
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:
Happy scripting!
Comments