Как написать шаблон поиска, чтобы включить пробел в findstr?

Я хочу искать все файлы в определенном каталоге для вхождений операторов, таких как

  Load frmXYZ

Я на Windows 7, используя . Я попробовал:

  findstr /n Load.*frm *.*

но это дает нежелательные результаты, такие как:

 If ABCFormLoaded Then Unload frmPQR

поэтому я попытался поставить пробел между Load и frm и дал команду вот так:

 findstr /n Load frm *.*

но это просто искало все вхождения слова load или все вхождения слово frm. Как мне обойти эту проблему?

4 ответов


если вы используете пробелы, вам нужен /C: возможность передать строку(ы) литерала в регулярное выражение .
Как только он попадает в регулярное выражение, он рассматривается как регулярное выражение.

тем не менее, это типичный MS trash.

использовать две строки regex поиск

суть в том, что вы должны использовать 2 строки для обработки случаев, когда
Load frm в начале так:

  • Load frm apples bananas carrots

или в середине так:

  • some other text Load frm and more.

версия без классов персонажей

ниже используется XP sp3, windows 7 может отличаться, оба являются мусором!

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

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

ум

Примечание: двоеточие в /C: является обязательным для этого, чтобы работать.

если вы оставите двоеточие, то findstrобработка ошибок-это просто лечение /C как инвалид вариант, игнорировать этот недопустимый вариант и идти вперед в любом случае. Что приводит к неожиданным и нежелательным результатам.

эквивалентная версия с использованием классов символов

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

разбивка классов символов

// 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'

настоящий regex может быть \bLoad\s+frm


использовать :

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

из справки (findstr /?):

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

используйте разделитель слов regex

я использовал специальный \< "начало слова" regex символ.

я пробовал это на версии Win10 findstr. Но, по словам Microsoft это специальный \< символ был в findstr.exe С тех пор WinXP.

полная (и болезненная) разбивка многих вариантов, которые не работают ниже.

в самом низу: что на самом деле работал.

пример файла сам

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.

неправильно. При регулярном выполнении пространство рассматривается как разделитель.

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.

неправильно: с параметром Regex пространство по-прежнему рассматривается как разделитель.

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.    

более правильно, но все равно не так. С опцией /C мы теперь получаем сохраненные пробелы, но не находим других случаев символов.

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.

неправильно. /I для "игнорировать случай" не помогает. Мы получаем спички изнутри слов, которые нам не нужны.

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.

право. Использовать специальные "Начало слова" regex символ. Соответствует началу строки или пробел.

чувствительный к регистру:

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.

или игнорирование случая

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.

этот фрагмент кода будет разрешать только буквы, цифры, подчеркивание и пробел в ключевом слове:

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