msdos examples ejemplos bat regex findstr

regex - examples - ¿Cómo escribir un patrón de búsqueda para incluir un espacio en findstr?



findstr windows 10 (4)

Quiero buscar en todos los archivos de un directorio determinado las ocurrencias de declaraciones como

Load frmXYZ

Estoy en Windows 7, usando el comando findstr . Lo intenté:

findstr /n Load.*frm *.*

Pero esto me da resultados no deseados como:

If ABCFormLoaded Then Unload frmPQR

Así que intenté poner un espacio en blanco entre Load y frm y di el siguiente comando:

findstr /n Load frm *.*

Pero esto simplemente buscó todas las apariciones de la palabra load o todas las apariciones de la palabra frm . ¿Cómo puedo solucionar este problema?


Use la palabra delimitador regex

Utilicé el símbolo especial de expresión regular /< principio de palabra ".

He intentado esto en la versión Win10 de findstr. Pero de acuerdo con Microsoft, este símbolo especial /< ha estado en findstr.exe desde WinXP .

Desglose completo (y doloroso) de muchas opciones que NO funcionan a continuación.

En la parte inferior: lo que realmente funcionó.

El propio archivo de muestra.

C:/>type lines.txt Load frmXYZ // This line should match. If ABCFormLoaded Then Unload frmPQR // This line should NOT match. pears Load frm grapes pineapples // This line should match. // This blank line should NOT match. LOAD FRMXYZ // This line should match. IF ABCFORMLOADED THEN UNLOAD FRMPQR // This line should NOT match. PEARS LOAD FRM GRAPES PINEAPPLES // This line should match. // This blank line should NOT match. load frmxyz // This line should match. if abcformloaded then unload frmpqr // This line should NOT match. pears load frm grapes pineapples // This line should match.

Incorrecto. Con la ejecución regular el espacio se trata como delimitador.

C:/>type lines.txt | findstr /N "Load frm" 1:Load frmXYZ // This line should match. 2:If ABCFormLoaded Then Unload frmPQR // This line should NOT match. 3:pears Load frm grapes pineapples // This line should match. 9:load frmxyz // This line should match. 10:if abcformloaded then unload frmpqr // This line should NOT match. 11:pears load frm grapes pineapples // This line should match.

Incorrecto: con la opción Regex, el espacio todavía se trata como delimitador.

C:/>type lines.txt | findstr /N /R "Load frm" 1:Load frmXYZ // This line should match. 2:If ABCFormLoaded Then Unload frmPQR // This line should NOT match. 3:pears Load frm grapes pineapples // This line should match. 9:load frmxyz // This line should match. 10:if abcformloaded then unload frmpqr // This line should NOT match. 11:pears load frm grapes pineapples // This line should match.

Más correcto pero todavía incorrecto. Con la opción / C ahora obtenemos espacios preservados pero no encontramos otros casos de personajes.

C:/>type lines.txt | findstr /N /R /C:"Load frm" 1:Load frmXYZ // This line should match. 3:pears Load frm grapes pineapples // This line should match.

Incorrecto. / I para "Ignorar caso" no ayuda. Obtenemos coincidencias de palabras que no queríamos.

C:/>type lines.txt | findstr /N /R /I /C:"Load frm" 1:Load frmXYZ // This line should match. 2:If ABCFormLoaded Then Unload frmPQR // This line should NOT match. 3:pears Load frm grapes pineapples // This line should match. 5:LOAD FRMXYZ // This line should match. 6:IF ABCFORMLOADED THEN UNLOAD FRMPQR // This line should NOT match. 7:PEARS LOAD FRM GRAPES PINEAPPLES // This line should match. 9:load frmxyz // This line should match. 10:if abcformloaded then unload frmpqr // This line should NOT match. 11:pears load frm grapes pineapples // This line should match.

Derecha. Use el símbolo de expresión regular "Principio de palabra" especial. Coincide con el principio de línea o espacio.

Cualquier caso sensible:

C:/>type lines.txt | findstr /N /R /C:"/<Load frm" 1:Load frmXYZ // This line should match. 3:pears Load frm grapes pineapples // This line should match.

o ignorando el caso

C:/>type lines.txt | findstr /N /R /I /C:"/<Load frm" 1:Load frmXYZ // This line should match. 3:pears Load frm grapes pineapples // This line should match. 5:LOAD FRMXYZ // This line should match. 7:PEARS LOAD FRM GRAPES PINEAPPLES // This line should match. 9:load frmxyz // This line should match. 11:pears load frm grapes pineapples // This line should match.


Este fragmento de código solo permitirá letras, números, guiones bajos y espacios en blanco en palabras clave:

set /p keyword="Enter keyword: " || Set keyword= set keyword_replaced=%keyword: =_% echo %keyword_replaced%| findstr /r "[^0-9a-zA-Z_]" > nul if errorlevel 1 goto noexit echo special characters in keyword not allowed (except space and _), TERMINATING timeout 4 exit /b 0 :noexit


Si usa espacios, necesita la opción /C: para pasar las cadenas literales a la opción regex /R
Una vez que llega a la expresión regular, se trata como una expresión regular.

Dicho esto, esta es la típica basura de MS.

Utilice dos cadenas de búsqueda regex

La conclusión es que tiene que usar 2 cadenas para manejar casos donde
Load frm está al principio así:

  • Load frm apples bananas carrots

O en el medio como así:

  • some other text Load frm and more .

Versión sin clases de caracteres.

A continuación se usa XP SP3, Windows 7 puede ser diferente, ¡ambos son basura!

findstr /N /R /C:" *Load *frm" /C:"^Load *frm" test.txt

7:Load frm is ok 8: Load frm is ok

Cuidado con el colon

NOTA: Los dos puntos en /C: son OBLIGATORIOS para que esto funcione.

Si deja de lado los dos puntos, entonces el manejo de errores de findstr es simplemente tratar a /C como una opción no válida, ignorar esa opción inválida y seguir adelante de todos modos. Conduce a resultados inesperados y no deseados.

Versión equivalente utilizando clases de caracteres.

findstr /N /R /C:"[ ][ ]*Load[ ][ ]*frm" /C:"^Load[ ][ ]*frm" test.txt

Desglose de clases de personajes

// The first regex search string breaks down like this: [ ] // require 1 space [ ]* // optional many spaces Load // literal ''Load'' [ ] // require 1 space [ ]* // optional many spaces frm // literal ''frm'' // The second regex search string breaks down like this: ^ // beginning of line Load // literal ''Load'' [ ] // require 1 space [ ]* // optional many spaces frm // literal ''frm''

Un regex real podría ser /bLoad/s+frm


Use la opción /c :

findstr /n /c:"Load frm" *.*

De la ayuda ( findstr /? ):

/C:string Uses specified string as a literal search string.