grep误报

时间:2013-01-12 16:27:49

标签: unix grep

我有六个html标签我关心检查自闭标签是否错误完成。标签为:<input/><br/><hr/><img/><link/><meta/>。我也在寻找它在结束标记之前没有空格,因为页面是xhtml。基本上我想找到那些不会自动关闭的东西,或者如果它确实在它前面有一个空间。

现在我只关注其中一个标签(输入)。它收集了一些但不是全部。例如,它会选择它应该执行的<input type='submit' value='Save'>。但它并没有获得<input type="text" name="name" id="name"/>。它还会选择正确的自闭项标签,例如<input type='submit' value='Save' /></td></tr>

我的grep是:

grep "<input(.*[^/])>." *

任何想法为什么?

3 个答案:

答案 0 :(得分:0)

为什么要选择<input type="text" name="name" id="name"/>?这是一个正确关闭的标签。

答案 1 :(得分:0)

我认为您当前的正则表达式不起作用,因为它匹配整行。只要注意它,看起来你匹配开头字符串“<input”然后尽可能多的字符匹配,最后一个字符不是/,然后是结束{{ 1}}。

对于>,因为它很贪婪,它会一直运行到最后一个<input type='submit' value='Save' /></td></tr>。恰好是>的{​​{1}}(因为你的grep以>结束)

作为一个hack-y替代品(我确信有更优雅的方式来做到这一点......):

td

(grep 2.6.3 / cygwin,如果那是相关的)

粗略翻译:以“.”开头,然后以“grep -P -o "<input.*?(?<=( .)|([^/]))>" test.html ”(懒惰地)结束,然后回头检查结束前的第二个最后一个字符{ {1}}不是空格,或者最后一个字符不是斜线。

如果test.html有(为了论据的缘故):

<input

输出是:

>

更一般地说,如果您希望测试是否符合xhtml,lxml会让您的生活更轻松吗?

答案 2 :(得分:0)

使用Regexes解析HTML是not advisable

但是,如果您的HTML格式化,以便每行只有一个标记,那么您可以放弃grep '<input' * | grep -v " />"