web-dev-qa-db-fra.com

Comment écrire un modèle de recherche pour inclure un espace dans findstr?

Je souhaite rechercher dans tous les fichiers d'un certain répertoire des occurrences d'instructions telles que

  Load frmXYZ

Je suis sous Windows 7, en utilisant la commande findstr. J'ai essayé:

  findstr /n Load.*frm *.*

Mais cela me donne des résultats indésirables tels que:

 If ABCFormLoaded Then Unload frmPQR

J'ai donc essayé de mettre un espace vide entre Load et frm et j'ai donné la commande comme ceci:

 findstr /n Load frm *.*

Mais cela a simplement recherché toutes les occurrences du mot load ou toutes les occurrences du mot frm. Comment contourner ce problème?

30
CodeBlue

Si vous utilisez des espaces, vous avez besoin du /C: option pour passer la ou les chaînes littérales à l'expression régulière /R option.
Une fois qu'il arrive au regex, il est traité comme un regex.

Cela dit, il s'agit d'une corbeille MS typique.

Utilisez deux chaînes de recherche d'expression régulière

L'essentiel est que vous devez utiliser 2 chaînes pour gérer les cas où
Load frm est au début comme ceci:

  • Load frm apples bananas carrots

OU au milieu comme ça:

  • some other text Load frm and more.

Version sans classes de caractères

Ci-dessous utilise XP sp3, Windows 7 peut être différent, les deux sont des ordures!

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

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

Attention au colon

REMARQUE: Les deux points dans /C: est OBLIGATOIRE pour que cela fonctionne.

Si vous omettez les deux-points, la gestion des erreurs de findstr consiste simplement à traiter /C comme option non valide, ignorez cette option non valide et continuez quand même. Menant à une sortie inattendue et indésirable.

Version équivalente utilisant des classes de caractères

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

Répartition des classes de caractères

// 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 vrai regex pourrait être \bLoad\s+frm

28
sln

Utilisez le /c option:

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

De l'aide (findstr /?):

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

Utiliser l'expression régulière du délimiteur Word

J'ai utilisé le symbole regex spécial \< "Début de Word".

J'ai essayé ceci sur la version Win10 de findstr. Mais selon Microsoft, ce symbole spécial \< Est dans findstr.exe Depuis WinXP .

Décomposition complète (et douloureuse) de nombreuses options qui ne fonctionnent PAS ci-dessous.

Tout en bas: ce qui a réellement fonctionné.

L'exemple de fichier lui-même

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.

Faux. Avec une exécution régulière, l'espace est traité comme un délimiteur.

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.

Incorrect: Avec l'option Regex, l'espace est TOUJOURS traité comme un délimiteur.

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.    

Plus juste mais toujours faux. Avec l'option/C, nous obtenons maintenant des espaces préservés mais ne trouvons pas d'autres cas de caractères.

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.

Faux./I pour "Ignorer le cas" n'aide pas. Nous obtenons des correspondances à partir de mots que nous ne voulions pas.

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.

Droite. Utilisez le symbole regex spécial "Début de Word". Correspond au début de la ligne ou à l'espace.

Soit la casse:

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.

ou ignorer la casse

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.
3
StackzOfZtuff