如何 grep 损坏的 HTML 标签?

gkm*_*hit 0 shell grep bash html

我想查看我所有的 HTML 文件,看看那里是否有任何错误的标签,例如<br><hr>等等,也就是说,我想查看 HTML 文件中没有关闭哪些标签。

for htmlFile in `ls -f *.html ` ; do
        if `cat $htmlFile | grep -inE "\<br\>"` ; then
           echo "In file $htmlFile there are errors on the following lines: "  >> ~/Desktop/$1_errors.txt
           cat $htmlFile | grep -in "<br>"| cut -d ":" -f1 >> ~/Desktop/$1_errors.txt
           echo "----------------------------------------" >> ~/Desktop/$1_errors.txt
       fi
done
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误,我怀疑是我的正则表达式。

./script.sh: line 14: 10:<BR: command not found
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误之一:)

Cal*_*leb 8

即使您像Braiam 的回答正确识别的那样修复了 shell 语法中的错误,您也永远不会让它真正正常工作。充其量你可能会发现一些你知道自己犯过的错误;但是你永远不会得到 grep 来可靠地找到你可能没有注意到你正在破坏的那种损坏的标签。

要正确地做到这一点,您需要使用能够真正解析和理解 HTML 标签的东西。有很多 HTML 验证工具可以指出您在哪里破坏了标记语法。您应该从签出开始的最常见的一种是tidy. 特别是尝试使用此标志在您的文件上运行它:

 -errors, -e         show only errors and warnings
Run Code Online (Sandbox Code Playgroud)

这将指出您在哪里损坏了标签,例如没有按照符合您的文档类型的方式关闭的东西。

除了 tidy 对 HTML 进行语法检查之外,还有许多其他选项。使用W3C 验证器是一个不错的选择。无论你做什么——冒着计算机之神向你下火和硫磺的风险——甚至不要尝试用正则表达式解析 html 语法,比如 grep 用于模式匹配。


Bra*_*iam 5

您的问题在这一行:

if `cat $htmlFile | grep -inE "\<br\>"` ; then
Run Code Online (Sandbox Code Playgroud)

它告诉外壳:

  • cat 一个文件,
  • 解析它并寻找与<br>标签匹配的行,
  • 执行输出

问题是最后一步,你不应该执行命令的输出而是测试它:

if grep -inEq "\<br\>" $htmlFile ; then
Run Code Online (Sandbox Code Playgroud)

当然,要解析 HTML,您应该使用真正的解析器,而不是正则表达式。