我有时需要在包含 HTML 文档的本地目录中搜索特定单词。通常我会使用名为 File Locator Pro 的程序,大多数情况下它都很好用。
但是,在某些情况下,我要查找的单词是 JavaScript 或 HTML 中常用的关键字或变量名,例如“child”。在这种情况下,由于此搜索仅针对原始文件内容,因此搜索结果会包含来自脚本或标签的数千个无用匹配项。
有没有什么方法可以让我在许多 HTML 文件中搜索 HTML 文件内容并且搜索将忽略 HTML 标签和脚本?
这不一定非要使用 File Locator Pro;任何解决方案都值得关注,但最好是在 Windows 上运行并且不需要其他昂贵软件的解决方案。
答案1
我将使用一个著名的移植到 Windows 的 Linnux 工具:grep
现在,您必须执行一些棘手的链接部分,以首先匹配您想要的内容,然后使用类似这样的搜索来过滤最多的误报age
(<image...>
在我的测试用例中匹配标签和一些 js):
grep -ri 'age' * | grep -v '<script[^>]+>[^<]+<\/script>' | grep -v '<[^>]*age[^>]*>' | grep -E '^[^.]*\.(php|html)'
它的作用如下(每个 grep 命令):
- 它首先获取所有包含
age
递归-r
和不区分大小写的行-i
- 然后它匹配
<script*>*</script>
块内除内容之外的所有内容(-v
反转匹配),从匹配中删除脚本块 - 第三个从标签内删除匹配,这可能会排除有效结果,例如
<div id=age>age</div>
如果标签与搜索词位于同一行。 - 最后,它会根据文件名过滤结果,只保留 php 或 html 文件,这需要扩展正则表达式(grep 选项
-E
)来进行 A 或 B 构造(A|B)
这可能有点复杂,但你无法使用正则表达式解析 html并使用 (X)HTML 解析器解析每个文件然后仅找到文本,这听起来也相当复杂。
答案2
答案3
Windows 命令行(仍然)不如 *nix 系统那么强大 - 但即使在那里,您的场景和愿望也不容易解决。正如 @Tensibai 所说:您基本上想要解析文件中的上下文事件。Windows 轻量级 grep 现在被称为查找字符串,比旧的好一点寻找是,但没有 grep 那么强大。如果你像 @fab2s 建议的那样安装 cygwin,你大概可以构建一个脚本来执行以下操作:
- 找到您感兴趣的所有文件 (*.html) [寻找]
- 输出它们并加上行号,所有换行符都改为未使用的内容(比如说控制角色),使它们位于一行上,但仍然“知道“行结束的位置。[sed]
- 提取所有脚本块和包装器标签[sed..再次]
- 反转换行符替换 [sed]
..最后..
- grep 获取结果 [grep]