regex - FINDSTR 中 RegEx 字符串的多个实例

标签 regex windows batch-file cmd findstr

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

我已经尝试使用 FINDSTR:

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

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

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

谢谢

最佳答案

可以使用 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 不按数字代码值整理字符。

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

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

关于regex - FINDSTR 中 RegEx 字符串的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16609848/

相关文章:

java - 排除正则表达式中的 url 模式

regex - 如何使用 grep 对多个文本字符串进行反向搜索

c++ - 为什么我的程序设计为耗尽 RAM 和 CPU 而没有使用所有 RAM 和 CPU?

batch-file - 将当前目录永久添加到 Windows 路径

regex - R - 使用正则表达式,在字符串中的第 n 个点之前设置位置并删除后面的内容

javascript - 正则表达式在javascript中查找连续数字

linux - git 更改未反射(reflect)在远程存储库中

Windows 上的 C Socket 编程在监听时出现错误,但没有 errno

c# - 文件输入和输出

utf-8 - Windows XP - cmd.exe - 切换到 utf8 代码页后无法执行批处理文件