我想 grep 遍历所有 HTML 文件,看看那里是否有任何错误标签,例如 example等等,这就是我想查看 HTML 文件中哪些标签未关闭<br>
。<hr>
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
但我收到一个错误,我怀疑它是我的正则表达式。
./script.sh: line 14: 10:<BR: command not found
这是我得到的错误之一:)
答案1
即使您将 shell 语法中的错误修复为布雷亚姆的回答正确识别,你会绝不让这个真正发挥作用。最好的情况下,你可能会发现一些你知道自己会犯的错误;但是你永远不会让 grep 可靠地找到你可能没有注意到你正在破坏的那种破坏的标签。
为了正确地做到这一点,您需要使用能够真正解析和理解 HTML 标签的东西。有很多 HTML 验证工具可以指出标签语法的问题。您应该首先检查的最常见的情况之一是tidy
。特别是尝试使用此标志在您的文件上运行它:
-errors, -e show only errors and warnings
这将指出您在哪里有损坏的标签,例如没有按照您的文档类型应有的方式关闭的内容。
除了 tidy 之外,还有很多其他选项可以对 HTML 进行语法检查。使用W3C 验证器是一个很好的。无论你做什么——都要冒着计算机之神的风险烈火与硫磺倾泻在你身上—甚至不要尝试使用正则表达式来解析 html 语法,例如 grep 用于模式匹配的正则表达式。
答案2
您的问题在这一行:
if `cat $htmlFile | grep -inE "\<br\>"` ; then
它告诉 shell:
- 猫一个文件,
- 解析它并查找与
<br>
标签匹配的行, - 执行输出
问题是最后一步,您不应该执行命令的输出,而应该测试它:
if grep -inEq "\<br\>" $htmlFile ; then
当然,要解析 HTML,您应该使用真正的解析器,而不是正则表达式。