Команда Findstr и ее использование в цикле
Назначение команды - поиск строк в текстовых файлах.
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:файл]
[/C:строка] [/G:файл] [/D:список_папок] [/A:цвета] [/OFF[LINE]]
строки [[диск:][путь]имя_файла[...]]
/L Поиск строк дословно.
/R Поиск строк как регулярных выражений.
/S Поиск файлов в текущей папке и всех ее подпапках.
/I Определяет, что поиск будет вестись без учета регистра.
/X Печатает строки, которые совпадают точно.
/V Печатает строки, не содержащие совпадений с искомыми.
/N Печатает номер строки, в которой найдено совпадение, и ее содержимое.
/M Печатает только имя файла, в которой найдено совпадение.
/O Печатает найденный строки через пустую строку.
/P Пропускает строки, содержащие непечатаемые символы.
/F:файл Читает список файлов из заданного файла (/ для консоли).
/C:строка Использует заданную строку как искомую фразу поиска.
/D:список_папок Поиск в списке папок (разделяются точкой с запятой).
строка Искомый текст.
[диск:][путь]имя_файла - задает имя файла или файлов.
Использовать пробелы для разделения нескольких искомых строк, если аргумент не
имеет префикса /C. Например, 'FINDSTR "Привет мир" a.b' ищет "Привет" или
"мир" в файле a.b, а команда 'FINDSTR /C:"Привет мир" a.b' ищет строку
"Привет мир" в файле a.b.
Краткая сводка по синтаксису регулярных выражений:
. Любой символ.
* Повтор: ноль или более вхождений предыдущего символа или класса
^ Позиция в строке: начало строки
$ Позиция в строке: конец строки
[класс] Класс символов: любой единичный символ из множества
[^класс] Обратный класс символов: любой единичный символ из дополнения
[x-y] Диапазон: любые символы из указанного диапазона
\x Служебный символ: символьное обозначение служебного символа x
\<xyz Позиция в слове: в начале слова
xyz\> Позиция в слове: в конце слова
Пример командного файла для поиска в файле num.txt по образцу строк, в которых присутствует хотя бы одна двоичная цифра.
@echo off
set /a kol=0
for /f %%b in ('findstr /rc:"[0-1]" num.txt') do set /a kol=kol+1
echo %kol%
В командных файлах для организации циклов используются несколько разновидностей оператора FOR, которые обеспечивают следующие функции:
- выполнение заданной команды для всех элементов указанного множества;
- выполнение заданной команды для всех подходящих имен файлов;
- выполнение заданной команды для всех подходящих имен каталогов;
- выполнение заданной команды для определенного каталога, а также всех его подкаталогов;
- получение последовательности чисел с заданными началом, концом и шагом приращения;
- чтение и обработка строк из текстового файла;
- обработка строк вывода определенной команды.
1.1.13.1. Цикл FOR … IN … DO …
Самый простой вариант синтаксиса команды FOR для командных файлов имеет следующий вид:
FOR %%переменная IN (множество) DO команда [параметры]Внимание!
Перед названием переменной должны стоять именно два знака процента (%%), а не один, как это было при использовании команды FOR непосредственно из командной строки!
Пример 5. Если в командном файле заданы строки
@ECHO OFFFOR %%i IN (Раз, Два, Три) DO ECHO %%iто в результате его выполнения на экран будет выведено следующее:
РазДваТриПараметр множество в команде FOR задает одну или более текстовых строк, разделенных запятыми, которые необходимо обработать с помощью заданной команды. Скобки здесь обязательны. Параметр команда [параметры] задает команду, выполняемую для каждого элемента множества, при этом вложенность команд FOR на одной строке не допускается. Если в строке, входящей во множество, используется запятая, то значение этой строки нужно заключить в кавычки. Например, в результате выполнения файла с командами
@ECHO OFFFOR %%i IN ("Раз,Два",Три) DO ECHO %%iна экран будет выведено
Раз,ДваТриПараметр %%переменная представляет подставляемую переменную (счетчик цикла), причем здесь могут использоваться только имена переменных, состоящие из одной буквы. При выполнении команда FOR заменяет подставляемую переменную текстом каждой строки в заданном множестве, пока команда, стоящая после ключевого слова DO, не обработает все такие строки.