Как написать шаблон поиска, чтобы включить пробел в 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