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)
这是我得到的错误之一:)
即使您像Braiam 的回答正确识别的那样修复了 shell 语法中的错误,您也永远不会让它真正正常工作。充其量你可能会发现一些你知道自己犯过的错误;但是你永远不会得到 grep 来可靠地找到你可能没有注意到你正在破坏的那种损坏的标签。
要正确地做到这一点,您需要使用能够真正解析和理解 HTML 标签的东西。有很多 HTML 验证工具可以指出您在哪里破坏了标记语法。您应该从签出开始的最常见的一种是tidy
. 特别是尝试使用此标志在您的文件上运行它:
-errors, -e show only errors and warnings
Run Code Online (Sandbox Code Playgroud)
这将指出您在哪里损坏了标签,例如没有按照符合您的文档类型的方式关闭的东西。
除了 tidy 对 HTML 进行语法检查之外,还有许多其他选项。使用W3C 验证器是一个不错的选择。无论你做什么——冒着计算机之神向你下火和硫磺的风险——甚至不要尝试用正则表达式解析 html 语法,比如 grep 用于模式匹配。
您的问题在这一行:
if `cat $htmlFile | grep -inE "\<br\>"` ; then
Run Code Online (Sandbox Code Playgroud)
它告诉外壳:
<br>
标签匹配的行,问题是最后一步,你不应该执行命令的输出而是测试它:
if grep -inEq "\<br\>" $htmlFile ; then
Run Code Online (Sandbox Code Playgroud)
当然,要解析 HTML,您应该使用真正的解析器,而不是正则表达式。