在Windowsbatch file中的grep

我想写一个Windowsbatch file,将通过一个特定的HTML索引文件看起来像这样(简体)

<a href=emergency.htm>Emergency Calls</a><br> <a href=EmeRgency.htm>Emergency Calls</a><br> <a href=Emergency.htm>Emergency Calls</a><br> <a href=EMERGENCY.htm>Emergency Calls</a><br> <a href=E911.htm>Emergency Calls</a><br> <a href=e911.htm>Emergency Calls</a><br> 

并打印所有文件名都包含大写字母的链接,这样它们可能会被纠正为不包含任何大写字母。

以下在unix中的作品:

 $ grep -v '^<a href=[^AZ]*\.htm' helpindex.htm <a href=EmeRgency.htm>Emergency Calls</a><br> <a href=Emergency.htm>Emergency Calls</a><br> <a href=EMERGENCY.htm>Emergency Calls</a><br> <a href=E911.htm>Emergency Calls</a><br> 

(-v反转比赛)

但是使用Windows下的UnxUtils grep,这是一个unix grep的直接端口,我不能想出一个引用正则expression式的方法。 这将有必要在batch file中使用它。 我尝试了“,”没有喜悦,也没有-E开关。有没有办法使用这个特定的工具集来做到这一点?

@janos把我引向了Windows中的findstr命令,但它仍然不起作用。 看着findstr帮助我看到:

FINDSTR [/ B] [/ E] [/ L] [/ R] [/ S] [/ I] [/ X] [/ V] [/ N] [/ P] [ / F:file] [/ C:string] [/ G:file] [/ D:dir list] [/ A:color attributes] [/ OFF [LINE]] strings [[drive:] [path] filename [ ..]


/ V只打印不包含匹配的行。 …
/ C:string使用指定的string作为文字searchstring。 …

使用空格分隔多个searchstring,除非参数前缀为/ C。 例如,'FINDSTR'hello there“xy”在文件xy'FINDSTR / C中search“hello”或“there”:“hello there”xy'在文件xy中search“hello there”

但是,这也不起作用:

 C:\home\sftp>findstr /V /C:"^<a href=[^AZ]*\.htm" helpindex.htm <a href=emergency.htm>Emergency Calls</a><br> <a href=EmeRgency.htm>Emergency Calls</a><br> <a href=Emergency.htm>Emergency Calls</a><br> <a href=EMERGENCY.htm>Emergency Calls</a><br> <a href=E911.htm>Emergency Calls</a><br> <a href=e911.htm>Emergency Calls</a><br> 

findtr是垃圾,或者与grep有一些细微的差别。

这在Windows命令控制台中适用于我:

 grep -v "^<a href=[^AZ]*\.htm" helpindex.htm 

FINDSTR不与[^AZ]一起工作,因为它使用非标准的整理顺序:请参阅为什么findstr不能正确处理大小写(在某些情况下)?

你可以使用FINDSTR来获得你想要的输出:

 findstr /rvc:"^<a href=[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]*\.htm" helpindex.htm 

/ C选项需要强制整个字符串被视为一个搜索项。

/ R选项需要强制作为正则表达式的搜索词的解释。 / C选项的缺省值是一个字符串文字。

您可能需要了解Windows FINDSTR命令的未记录的功能和限制是什么? 。 有一个很长的名单“陷阱”

编辑

UnxUtils是针对Windows的GNU unix实用程序的陈旧过时版本。 您应该从GNU Coreutils获得更新的版本:请参阅UnxUtils和GNU CoreUtils之间的区别

我相信我从http://gnuwin32.sourceforge.net/packages/coreutils.htm获得了我的GNU Coreutils发行版。 我不确定这是否是最新的软件包,但它应该解决您的grep问题。 它提供了许多实用程序的便利包。

另一个选择是从http://gnuwin32.sourceforge.net/packages.html获取个人的Windows GNU工具

您可以使用我想要的FindRepl.bat程序。 例如:

 > type helpindex.htm <a href=emergency.htm>Emergency Calls</a><br> <a href=EmeRgency.htm>Emergency Calls</a><br> <a href=Emergency.htm>Emergency Calls</a><br> <a href=EMERGENCY.htm>Emergency Calls</a><br> <a href=E911.htm>Emergency Calls</a><br> <a href=e911.htm>Emergency Calls</a><br> > FindRepl /V "^<a href=[^AZ]*\.htm" < helpindex.htm <a href=EmeRgency.htm>Emergency Calls</a><br> <a href=Emergency.htm>Emergency Calls</a><br> <a href=EMERGENCY.htm>Emergency Calls</a><br> <a href=E911.htm>Emergency Calls</a><br> 

你可以从这个网站下载FindRepl.bat