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.