如何通过搜索和替换验证大量文件?

时间:2008-10-28 02:35:36

标签: html perl unix omittag

我目前正在验证客户端的HTML源代码,并且我为没有Omittag的图像和输入文件收到了很多验证错误。我会手动完成,但这个客户端实际上有数千个文件,其中很多实例都没有。

此客户端验证了一些img标签(无论出于何种原因)。

只是想知道是否有一个unix命令我可以运行检查是否没有Omittag来添加它。

我已完成简单搜索并替换为以下命令:

find . \! -path '*.svn*' -type f -exec sed -i -n '1h;1!H;${;g;s/<b>/<strong>/g;p}' {} \; 

但从来没有这么大的东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

试试这个。它将浏览您的文件,对每个文件(perl的.orig运算符)进行-i备份,并将<img><input>标记替换为<img /><input >

find . \! -path '*.svn*' -type f -exec perl -pi.orig -e 's{ ( <(?:img|input)\b ([^>]*?) ) \ ?/?> }{$1\ />}sgxi' {} \;

给定输入:

<img>  <img/>  <img src="..">  <img src="" >
<input>  <input/>  <input id="..">  <input id="" >

将文件更改为:

<img />  <img />  <img src=".." />  <img src="" />
<input />  <input />  <input id=".." />  <input id="" />

以下是正则表达式的作用:

s{(<(?:img|input)\b ([^>]*?)) # capture "<img" or "<input" followed by non-">" chars
  \ ?/?>}                     # optional space, optional slash, followed by ">"
{$1\ />}sgxi                  # replace with: captured text, plus " />"

答案 1 :(得分:0)

查看我在评论中提出的问题。

假设您正在使用GNU sed,并且您尝试添加跟踪/到您的代码以符合XML <img />和{{1然后用你的命令替换命令中的sed表达式,它应该可以解决问题:<input />

这是一个简单的测试文件(SO的着色器做了古怪的事情):

'1h;1!H;${;g;s/\(img\|input\)\( [^>]*[^/]\)>/\1\2\/>/g;p;}'

此处为GNU sed regex syntaxhow the buffering works to do multiline search/replace

或者,您可以使用Tidy之类的设计用于清理不良HTML的内容 - 如果我做的事情比一些简单的搜索/替换更复杂,那就是我要做的事情。 Tidy的选项很快变得复杂,所以通常用你选择的脚本语言(Python,Perl)编写一个脚本来调用$ cat test.html This is an <img tag> without closing slash. Here is an <img tag /> with closing slash. This is an <input tag > without closing slash. And here one <input attrib="1" > that spans multiple lines. Finally one <input attrib="1" /> with closing slash. $ sed -n '1h;1!H;${;g;s/\(img\|input\)\( [^>]*[^/]\)>/\1\2\/>/g;p;}' test.html This is an <img tag/> without closing slash. Here is an <img tag /> with closing slash. This is an <input tag /> without closing slash. And here one <input attrib="1" /> that spans multiple lines. Finally one <input attrib="1" /> with closing slash. 并设置你需要的任何选项。