FINDSTR中的多个RegEx字符串实例

时间:2013-05-17 13:05:51

标签: regex windows batch-file cmd findstr

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

我已尝试使用FINDSTR

 FINDSTR /r .*Shutdown.*{5} file.txt

这似乎不起作用,但是如果我删除{5}它会成功执行。

此外,我最终希望5成为一个变量,可能这是通过某种动态命令实现的吗?

由于

3 个答案:

答案 0 :(得分:2)

.*Shutdown.*Shutdown.*Shutdown.*Shutdown.*Shutdown.*

似乎是FINDSTR

的唯一途径

srsly。


测试批次:

@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 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"
)

:: For 'shutdown' on n different lines: (assuming case-insensitive)
FOR /f %%i IN ('FIND /i /c "shutdown" ^<f5shutdown.txt') DO SET shutdowns=%%i
ECHO Second method: %shutdowns% lines found with "Shutdown"

:: For 'shutdown' occurrences (assuming case-insensitive)
SET /a shutdowns=0
FOR /f "delims=" %%i IN (f5shutdown.txt) DO (
 SET line=%%i
 CALL :findem
)
ECHO Third method found "Shutdown" %shutdowns% times
GOTO :eof

:findem
SET line=%line:"=%
SET after=%line:*shutdown=%
IF NOT DEFINED after SET /a shutdowns+=1&GOTO :EOF 
if NOT "%line%"=="%after%" SET "line=%after%"&SET /a shutdowns+=1&GOTO findem
GOTO :eof

(我为测试添加了一条额外的非关闭行。发现了8行和28次)

答案 1 :(得分:2)

可以使用FINDSTR检测“Shutdown”是否在文件中的任何位置出现5次或更多次。您需要的所有信息都包含在What are the undocumented features and limitations of the Windows FINDSTR command?中,但这有点过于棘手而且根本不明显。

正则表达式搜索可以跨多行匹配多个Shutdown实例,只要所有插入字符(包括回车符和换行符)与相应的字符类范围匹配即可。我无法发布此处所需的字符,因此我将在尖括号内使用符号表示法。

以下正则表达式将匹配除0xFF(十进制255)以外的任何字节字符。它由一个带有两个范围的字符类表达式组成,中间的间隙为0xFF。差距至关重要,因为如果包含0xFF,FINDSTR将失败(并可能挂起):

[<0x01>-<space><tab>-<0xEA>]

您可能认为该表达式应为[<0x01>-<0xFE>],但这不起作用,因为FINDSTR不会按字母数字代码值对字符进行整理。

因此,要在文件中的任何位置查找5个或更多Shutdown个实例,您需要进行以下正则表达式搜索:

Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown

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

这是一个完整的批处理脚本,它将最小数量的Shutdown实例作为第一个参数进行搜索,并将要搜索的文件的名称作为第二个参数。我再次在尖括号内使用符号表示法代替所需的实际字符。

@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

最大支持计数受最大正则表达式字符串长度的限制。对于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]

完整的正则表达式搜索将是:

Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown

这是完整的批处理脚本:

@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

答案 2 :(得分:0)

这应该检测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