2010-05-11 61 views
1

我有一个包含大量空标记属性的XML文件。例如:sed:搜索并用行号替换字符串

<mytag id=""> 
    <ontent>aaa</content> 
</mytag> 
<mytag id=""> 
    <ontent>bbb</content> 
</mytag> 
<mytag id=""> 
    <ontent>ccc</content> 
</mytag> 

现在我想用id =“”替换id =“” id =“2443”(id =“[linenumber]”)

我试图用sed做到这一点,但我没有得到一个成功的结果。

我希望这里有人能帮助我:-)

回答

2

如果你想id=""id="l"其中l是在mytag发现你可以做的行号,以取代空:

编辑:

根据的评论:

perl -pe '$i++; s{id=""}{id="$i"}' < file.xml 
+1

这将工作,只要XML输入不是自由格式,但是与发布完全相同。 Nit-pick:如果使用'perl -pe',则可以删除'print'。 – msw 2010-05-11 08:44:04

+1

如果我没有弄错,使用perl -ne /在这里可以更好地完成代码/ <文件名 - 为了速度的缘故,但除此之外。 – zellio 2010-05-11 08:47:04

+0

我在's'操作符上挖掘大括号。我总是忘记你可以做到这一点。 – msw 2010-05-11 09:03:39

0

你可能想尝试awk代替。行号存储在NR变量中。

1

如果您可以保证您的XML(可以是自由格式)与您写的确切形式相同,那么awk或perl可以更简单地完成这项工作ñsed。 Unicornaddict有一些东西,将工作,但我是一个小的代换系更加小心:

perl -pe '$i++; s{id=""}{id="$i"} if /^<mytag id="">/' filename.xml 

如果你不能保证XML是不自由的形式,你真的要解析它有一个适当的XML解析器。通用XML不能用正则表达式解析。