我尝试在大型目录中搜索包含任何.html
标记的任何<table>
个文件。 grep命令似乎是最合适的,但是我在确定要传递的参数时遇到了一些麻烦。
目前我有:grep -r -l "^<table>$" /directory_to_search_through
我使用-r以递归方式搜索所有文件,使用-l仅打印文件名。但是,当前字符串规范专门搜索<table>
,但我想进行更全面的搜索,其中包括任何包含id,类等的表标记。此外,我只想搜索.html
文件,但指定目录为/directory/*.html会产生一个&#39;没有这样的文件或目录&#39;信息。任何帮助将不胜感激。
答案 0 :(得分:1)
为了可靠地执行此操作,您确实需要使用真正的HTML解析器。如果它是xhtml,那么XML解析器也可以。
您可以通过以下方式获得所需结果的近似值:
find /directory/to/search -name '*.html' | xargs grep -l '<table[ \t>]'
这将检查以.html
为根的目录树中的所有/directory/to/search
个文件,在行的任何位置标识包含<table>
开始标记(的开头)的文件,但是它还可以识别误报,例如CDATA部分内的文本<table
(如果实际上该文件包含XHTML)。
答案 1 :(得分:0)
正如您已经发现的那样,grep不是理想的工具。如果您的输入是格式良好的XHTML,则可以使用XML解析器,例如xmlstarlet:
xmlstarlet sel -t -m //table -f -o " table id:" -v "@id" -o " class:" -v "@class" -n *.html
这只是选择所有<table>
元素,并提取它们的id,类和找到它们的文件的名称。
例如:
$ cat file.html
<html>
<body>
<table id="abc" class="something">
</table>
</body>
</html>
$ cat file2.html
<html>
<body>
<table id="def" class="something-else">
</table>
</body>
</html>
$ xmlstarlet sel -t -m //table -f -o " table id:" -v "@id" -o " class:" -v "@class" -n *.html
file.html table id:abc class:something
file2.html table id:def class:something-else