2

我正在尝试编写一个 Windows 批处理文件,该文件将查看一个看起来像这样的特定 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=[^A-Z]*\.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,它是 unx grep 的直接端口,我想不出一种引用正则表达式的方法。这对于在批处理文件中使用它是必要的。我已经尝试了“,”,没有任何乐趣,还有 -E 开关。有没有办法使用这个特定的工具集来做到这一点?

@janos 引导我使用 Windows 中的 findstr 命令,但它仍然不起作用。查看 findstr 帮助我看到:

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

...
/V 仅打印不包含匹配项的行。...
/C:string 使用指定的字符串作为文字搜索字符串。...

除非参数以 /C 为前缀,否则使用空格分隔多个搜索字符串。例如,'FINDSTR "hello there" xy' 在文件 xy 中搜索 "hello" 或 "there" 'FINDSTR /C:"hello there" xy' 在文件 xy 中搜索 "hello there"

但是,这也不起作用:

C:\home\sftp>findstr /V  /C:"^<a href=[^A-Z]*\.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>

findstr 要么是垃圾,要么与 grep 有一些细微差别。

4

2 回答 2

6

这在 Windows 命令控制台中对我来说很好:

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

FINDSTR 不适用,[^A-Z]因为它使用非标准排序序列:请参阅为什么 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 实用程序

于 2013-09-27T19:44:29.127 回答
2

您可以根据需要使用我的 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=[^A-Z]*\.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

于 2013-09-27T22:07:59.427 回答