viernes, 18 de marzo de 2022

Powershell: buscar una cadena dentro de unos ficheros recursivamente

 ¿Qué ficheros dentro de este directorio y descendientes contienen una cadena específica?


gci -recurse *.php |sls button |select -first 10

jueves, 17 de marzo de 2022

Jugando a wordle (versión tildes) con powershell

Después de probar un par de palabras en el Wordle de ayer (en versión tildes), y no dar con la palabra correcta, me decidí a tener algo de "ayuda" (la palabra "trampas" es muy fea) a partir de un diccionario.

Dado que tengo un fichero que es un listado de palabras en español, con una palabra por línea, me gustaría aplicar un filtro que me busque las palabras que cumplen determinadas condiciones, como tener una "P" en primera posición, contener una "L" (sin especificar la posición) y que tengan una determinada longitud.

Esto me dará varias opciones (en el mejor de los casos, puede que sólo haya una palabra que cumpla esas condiciones, en cuyo caso esa sería la palabra buscada), y mi idea era jugar alguna de esas palabras. Por eso decía lo de "ayuda" en vez de "trampas", pero vamos, puede llamarse de cualquiera de las dos formas. Lo importante aquí es cómo se hace eso en Powershell.

Para ponérmelo un poco más difícil, y simplificar el problema, no voy a exigir que se excluyan las palabras que no tienen alguna letra de las fallidas (es decir, si he puesto la T y esta letra no se incluye, NO voy a pedir que en el listado se excluya la T), tan sólo voy a exigir que se incluyan las letras que SÍ he acertado, y en las posiciones acertadas.

Mi fichero con la lista de palabras en español se llama words.es.txt.

Wordle con tildes: https://wordle.danielfrg.com/tildes/


 

Después de probar PLÁTANO, las letras acertadas están en las posiciones 0 (P) y 2 (L).

Otras letras acertadas, aunque estarán en otras posiciones, son la A y la O.

Lo interesante aquí es fijarse en el filtro para poner condiciones, que se pone con  el comando "Where-Object" seguido de una expresión entre {llaves}, aunque tiene un alias que me gusta, y es "?".

Así pues, la línea de comando powershell para listar las palabras que cumplen esas condiciones quedaría así:


gc words.es.txt |?{($_.length -eq 8) -and ($_[0] -eq 'p') -and ($_[2] -eq 'l')}|sls a |sls o

 

Curiosamente, he de filtrar por palabras de longitud 8, ya que palabras con letras especiales (eñes, tildes...) se convierten en dos letras, por ejemplo, "peldaño" y "policía" dan "peldaño" y "policía", convirtiendo palabras de 7 letras en 8.

Esto debe ser por tema de codificación diferente entre cmd.exe y powerhsell. Pero eso lo investigaré en otra ocasión.