ОК - поздно к таблице, но ... кажется, многие респонденты пропустили оригинальную спецификацию, что все адреса электронной почты встречаются в 1 строке . Это означает, что если вы не вводите CRLF с каждым появлением символа @, ваши предложения по использованию вариантов FINDSTR / c не помогут.
Среди инструментов Unix для DOS - очень мощный SED.exe. Погугли это. Это качает RegEx. Вот предложение:
find "@" datafile.txt | find "@" | sed "s/@/@\n/g" | find /n "@" | SED "s/\[\(.*\)\].*/Set \/a NumFound=\1/">CountChars.bat
Объяснение: (при условии, что файл с данными называется «Datafile.txt»)
1) Первый FIND включает в себя 3 строки информации заголовка, которая отбрасывает подход подсчета строк, поэтому передайте результаты во 2-ую (идентичную) находку, чтобы убрать ненужную информацию заголовка.
2) Направьте вышеприведенные результаты в SED, который будет искать каждый символ "@" и заменять его на себя + "\ n" (который является "новой строкой" или CRLF), который получает каждый "@" на своем собственная строка в выходном потоке ...
3) Когда вы передадите вышеприведенный вывод из SED в команду FIND / n, вы добавите номера строк в начало каждой строки. Теперь все, что вам нужно сделать, это выделить числовую часть каждой строки и предварять ее с помощью «SET / a», чтобы преобразовать каждую строку в пакетный оператор, который (все чаще с каждой строкой) устанавливает переменную, равную номеру этой строки. *
4) изолировать числовую часть каждой строки и предварять изолированное число в соответствии с приведенным выше:
| SED "s/\[\(.*\)\].*/Set \/a NumFound=\1/"
В приведенном выше фрагменте вы передаете выходные данные предыдущих команд в SED, который использует этот синтаксис "s / WhatToLookFor / WhatToReplaceItWith /", чтобы выполнить следующие действия:
a) ищите «[» (который должен быть «экранирован», если перед ним стоит «\»)
b) начать сохранение (или «токенизацию») в дальнейшем, вплоть до закрытия «]»
--> in other words it ignores the brackets but stores the number
--> the ".*" that follows the bracket wildcards whatever follows the "]"
c) материал между \(
и \)
является "токенизированным", что означает, что к нему можно будет обратиться позже, в разделе "WhatToReplaceItWith". Первый материал, который является токенизированным, называется через «\ 1», затем второй как «\ 2» и т. Д.
Итак ... мы игнорируем [и] и сохраняем число, заключенное в квадратные скобки, и игнорируем все оставшиеся в каждой строке символы с подстановочными знаками ... таким образом, мы заменяем строку на буквальная строка:
Set /a NumFound=
+ сохраненный или «токенизированный» номер, т.е.
... первая строка будет читать: Set /a NumFound=1
... а следующая строка гласит: Set /a NumFound=2
и т. д. и т. д.
Таким образом, если у вас есть 1283 адреса электронной почты, ваши результаты будут иметь 1283 строки.
Последний исполненный = тот, который имеет значение.
Если вы используете символ «>» для перенаправления всего вышеприведенного вывода в пакетный файл, то есть:
> CountChars.bat
... затем просто вызовите этот пакетный файл, и у вас будет переменная среды DOS с именем "NumFound" с вашим ответом.