Regex FINDSTR中正则表达式字符串的多个实例

Regex FINDSTR中正则表达式字符串的多个实例,regex,windows,batch-file,cmd,findstr,Regex,Windows,Batch File,Cmd,Findstr,我正在Windows批处理文件中寻找一种方法,以确定文件是否包含给定次数的单词Shutdown 我已经使用FINDSTR尝试过这一点: FINDSTR /r .*Shutdown.*{5} file.txt 这似乎不起作用,但如果我删除{5},它将成功执行 另外,我最终希望5是一个变量,大概这是可以通过某种动态命令实现的 谢谢 似乎是FINDSTR 斯雷 试验批次: @ECHO OFF SETLOCAL FOR /f "delims=" %%i IN (f5shutdown.txt) DO

我正在Windows批处理文件中寻找一种方法,以确定文件是否包含给定次数的单词
Shutdown

我已经使用
FINDSTR
尝试过这一点:

 FINDSTR /r .*Shutdown.*{5} file.txt
这似乎不起作用,但如果我删除
{5}
,它将成功执行

另外,我最终希望
5
是一个变量,大概这是可以通过某种动态命令实现的

谢谢

似乎是
FINDSTR

斯雷


试验批次:

@ECHO OFF
SETLOCAL
FOR /f "delims=" %%i IN (f5shutdown.txt) DO (
 ECHO %%i|FINDSTR /r .*Shutdown.*Shutdown.*Shutdown.*Shutdown.*Shutdown.* >NUL
 IF ERRORLEVEL 1 ECHO FAILED IN "%%i"
 IF NOT ERRORLEVEL 1 ECHO FOUND  IN "%%i"
)

GOTO :eof
f5shutdown.txt中的测试文本文件

Shutdown
Shutdown Shutdown
Shutdown Shutdown Shutdown Shutdown
Shutdown Shutdown Shutdown Shutdown Shutdown
Shutdown already !Shutdown Shutdown Shutdown Shutdown now
You should now Shutdown Shutdown Shutdown Shutdown Shutdown
ShutdownShutdownShutdownShutdownShutdown
OK, don't shutdown then...
结果:

FAILED IN "Shutdown"
FAILED IN "Shutdown Shutdown"
FAILED IN "Shutdown Shutdown Shutdown Shutdown"
FOUND  IN "Shutdown Shutdown Shutdown Shutdown Shutdown"
FOUND  IN "Shutdown already !Shutdown Shutdown Shutdown Shutdown now"
FOUND  IN "You should now Shutdown Shutdown Shutdown Shutdown Shutdown"
FOUND  IN "ShutdownShutdownShutdownShutdownShutdown"
FAILED IN "OK, don't shutdown then..."
为我工作(W7)


啊-也许你的意思是“发生在5行(或其他任何行)或“在文件中发生5次”

@ECHO关闭
SETLOCAL
对于(f5shutdown.txt)中的/f“delims=“%%i”DO(
ECHO%%i | FINDSTR/r.*关机。*关机。*关机。*关机。*关机。*关机。*>NUL
如果错误级别1回显在“%%i”中失败
如果不是,则在“%%i”中找到错误级别1回显
)
::对于n个不同行上的“shutdown”:(假定不区分大小写)
对于/f%%i IN('查找/i/c“关闭”^
似乎是
FINDSTR

斯雷


试验批次:

@ECHO OFF
SETLOCAL
FOR /f "delims=" %%i IN (f5shutdown.txt) DO (
 ECHO %%i|FINDSTR /r .*Shutdown.*Shutdown.*Shutdown.*Shutdown.*Shutdown.* >NUL
 IF ERRORLEVEL 1 ECHO FAILED IN "%%i"
 IF NOT ERRORLEVEL 1 ECHO FOUND  IN "%%i"
)

GOTO :eof
f5shutdown.txt中的测试文本文件

Shutdown
Shutdown Shutdown
Shutdown Shutdown Shutdown Shutdown
Shutdown Shutdown Shutdown Shutdown Shutdown
Shutdown already !Shutdown Shutdown Shutdown Shutdown now
You should now Shutdown Shutdown Shutdown Shutdown Shutdown
ShutdownShutdownShutdownShutdownShutdown
OK, don't shutdown then...
结果:

FAILED IN "Shutdown"
FAILED IN "Shutdown Shutdown"
FAILED IN "Shutdown Shutdown Shutdown Shutdown"
FOUND  IN "Shutdown Shutdown Shutdown Shutdown Shutdown"
FOUND  IN "Shutdown already !Shutdown Shutdown Shutdown Shutdown now"
FOUND  IN "You should now Shutdown Shutdown Shutdown Shutdown Shutdown"
FOUND  IN "ShutdownShutdownShutdownShutdownShutdown"
FAILED IN "OK, don't shutdown then..."
为我工作(W7)


啊-也许你的意思是“发生在5行(或其他任何行)或“在文件中发生5次”

@ECHO关闭
SETLOCAL
对于(f5shutdown.txt)中的/f“delims=“%%i”DO(
ECHO%%i | FINDSTR/r.*关机。*关机。*关机。*关机。*关机。*关机。*>NUL
如果错误级别1回显在“%%i”中失败
如果不是,则在“%%i”中找到错误级别1回显
)
::对于n个不同行上的“shutdown”:(假定不区分大小写)

对于/f%%i IN('FIND/i/c“shutdown”^这应该在文件.txt中只有5行关闭时检测

@echo off
for /f %%a in ('find /i /c "shutdown" ^< "file.txt" ') do if %%a EQU 5 echo found it 5 times
@echo关闭
对于('find/i/c“shutdown”^
当关闭仅在file.txt中的5行上时,应能检测到

@echo off
for /f %%a in ('find /i /c "shutdown" ^< "file.txt" ') do if %%a EQU 5 echo found it 5 times
@echo关闭
对于('find/i/c“shutdown”^
可以使用FINDSTR来检测文件中任何位置是否出现“Shutdown”5次或5次以上。您需要的所有信息都包含在文件中,但这有点棘手,一点也不明显

正则表达式搜索可以跨多行匹配关闭的多个实例,只要所有中间字符(包括回车符和换行符)都与适当的字符类范围匹配。我无法在此发布所需的字符,因此我将使用尖括号内的符号表示法

下面的正则表达式将匹配除0xFF(十进制255)之外的任何字节字符。它包含一个字符类表达式,其中两个范围和中间值为0xFF的间隙。该间隙是关键的,因为如果包含0xFF,FIFSTR将失败(并且可能挂起):

[<0x01>-<space><tab>-<0xEA>]
0xEA(十进制234)字符是扩展ASCII字符,扩展ASCII不能包含在FINDSTR搜索的命令行中。因此,必须将搜索字符串放入外部文件中,并且必须使用
/G:file
选项

这是一个完整的批处理脚本,它将要搜索的最少关机实例数作为第一个参数,将要搜索的文件名作为第二个参数。我再次使用尖括号内的符号符号来代替所需的实际字符

@echo off
set count=%1
set file=%2
setlocal enableDelayedExpansion
set "search="
for /l %%N in (1 1 %count%) do set "search=!search!Shutdown[<0x01>-<space><tab>-<0xEA>]*"
set "search=!search:~0,-9!"
echo(!search!>search.txt
findstr /rg:search.txt %file% >nul&&echo FOUND||echo NOT found
@echo关闭
设置计数=%1
设置文件=%2
setlocal enableDelayedExpansion
设置“搜索=”
对于/l%%N(1 1%计数%),请设置“搜索=!搜索!关闭[--]*”
设置“搜索=!搜索:~0,-9!”
echo(!search!>search.txt
findstr/rg:search.txt%file%>nul&&echo-FOUND | | echo-notfound
支持的最大计数受最大正则表达式字符串长度的限制。对于XP,最大正则表达式长度为127字节,等于计数7。在Vista和Windows 7上,最大正则表达式长度为254字节,应支持计数15。但我在Windows 7上的测试仅支持最多12个计数。其他测试显示,最大长度受影响由出现的字符串文本和字符类的数量以及它们之间的相对位置决定。但是我还没有找到一个精确的公式


如果您不想使用外部文件,那么下面的正则表达式几乎同样适用。它匹配除以下扩展ASCII十六进制代码之外的任何字符:0xE0、0xE2、0xE3、0xE4、0xE5、0xE7、0xE8、0xE9、0xEA、0xEB、0xED、0xEE、0xFF

[<0x01>-<space><tab>-Z]
[--Z]
完整的正则表达式搜索将是:

Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown
关机[--Z]*关机[--Z]*关机[--Z]*关机[--Z]*关机
下面是完整的批处理脚本:

@echo off
setlocal enableDelayedExpansion
set count=%1
set file=%2
set "search="
for /l %%N in (1 1 %count%) do set "search=!search!Shutdown[<0x01>-<space><tab>-Z]*"
set "search=!search:~0,-9!"
findstr /rc:"!search!" %file% >nul&&echo FOUND||echo NOT found
@echo关闭
setlocal enableDelayedExpansion
设置计数=%1
设置文件=%2
设置“搜索=”
对于/l%%N(1 1%计数%),请设置“搜索=!搜索!关机[--Z]*”
设置“搜索=!搜索:~0,-9!”
findstr/rc:“!search!”%file%>num&&echo-FOUND | | echo-notfound

可以使用FINDSTR来检测文件中任何位置是否出现“Shutdown”5次或5次以上。您需要的所有信息都包含在文件中,但这有点棘手,一点也不明显

正则表达式搜索可以跨多行匹配关闭的多个实例,只要所有中间字符(包括回车符和换行符)都与适当的字符类范围匹配。我无法在此发布所需的字符,因此我将使用尖括号内的符号表示法

下面的正则表达式将匹配除0xFF(十进制255)之外的任何字节字符。它包含一个字符类表达式,其中两个范围和中间值为0xFF的间隙。该间隙是关键的,因为如果包含0xFF,FIFSTR将失败(并且可能挂起):

[<0x01>-<space><tab>-<0xEA>]
0xEA(十进制234)字符是扩展ASCII字符,扩展ASCII不能包含在FINDSTR搜索的命令行中。因此,必须将搜索字符串放入外部文件和
/G:file