搜索数字时Findstr无法正常运行


1
findstr /rb /s "[2][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>" %userprofile%\*.txt >>output.txt

此代码的目的是在所有%userprofile%中搜索一个字符串,该字符串长度为16个数字并以数字2开头,然后将其写入output.txt中

在桌面上,我制作了一个名为test.txt的文件,其中包含以下数字,而没有其他内容:2123456789123456

在%userprofile%目录中找到包含findstr命令的程序。

但是,当我运行程序时,output.txt文件显示为空白。

编辑:有人对错误可能在哪里有想法吗?

Answers:


2

我已经在Windows FINDSTR命令的未记录功能和局限性中记录了许多令人困惑的FINDSTR功能和错误

您的代码中有两个导致失败的问题。

1)FINDSTR正则表达式最多可使用15个[class]术语

您的搜索有16个,因此它不起作用。但是您的第一个术语是[2],可以简化为2。因此,以下应该工作:

findstr /rb /s "2[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>" "%userprofile%\*.txt" >>output.txt

但事实并非如此,

>echo 2123456789123456|findstr /rb "2[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"

>

什么也不返回。

我相信这会暴露以前未知的错误或“功能”:-/

我没有时间进行彻底调查,但是建议的错误/功能是:

2)起始词锚\<和结束词锚\>都计入[class]术语限制15。如果搜索包括其中一个锚,并且累积术语计数正好为16,则搜索可能会静默失败(建议的新错误报告-在Win 10上进行了部分测试只要)

\>端锚字的一个非字字符或线的端部,或输入的结束之前应匹配点。但是在上面的测试用例中,有15个类术语,再加上一个单词锚点末尾,总共16个,这会静默失败。

如果我将测试更改为:

>echo 2123456789123456|findstr /rb "21[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
2123456789123456

>

然后,总数为15,并找到该数字。

同样,\<单词begin锚应该与输入的开始,行的开头或紧接在“非单词”字符之后的位置匹配。

但是下面的测试的累计期限计数为16,这也默默地失败了:

>echo 2123456789123456|findstr /r "\<2[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"

>

如果我删除其中一个类别术语,则计数为15,并且成功:

>echo 2123456789123456|findstr /r "\<21[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
2123456789123456

>

如果我在15个类别词中都包含两个锚,则总数为17,而我得到了FINDSTR: Search string too long.错误。

>echo 2123456789123456|findstr /r "\<2[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
FINDSTR: Search string too long.

>

如果我删除一个班级学期,则总学期数为16,并且它默默地失败:

>echo 2123456789123456|findstr /r "\<21[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"

>

如果我删除另一个班级学期,则总学期数为15,并且可以正常工作

>echo 2123456789123456|findstr /r "\<212[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
2123456789123456

>

1

当我运行程序时,output.txt文件显示为空白

有人对错误可能在哪里有想法吗?

您的搜索字符串太长。

示范:

> echo 2123456789123456 | findstr /rb "[2][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
FINDSTR: Search string too long.

> echo 2123456789123456 | findstr /rb "[2][0-9]*\>"
2123456789123456

进一步阅读


更准确地说,方括号类术语太多-FINDSTR最多只能包含15个。但是似乎还有另一个问题在起作用。
dbenham

@dbenham嗯。我看着您的精彩问答,但没有看到那里的限制。您为什么认为还有另一个问题?
DavidPostill

所以我将不得不使用VBScript之类的东西来搜索长度为16个数字的字符串?
丹尼尔(Daniel)

@Daniel或powershell。还是bash脚本...
DavidPostill

@DavidPostill-看到我的新答案。这个问题导致发现了一个新的“功能”
dbenham
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.