2014-09-30 112 views
0

我试图寻找在一个XML文件中的一些文本替换多行文本,该文本是:搜索和白色空间

</p_dpopis> 
    <IMGURL> 

,取而代之的是:

</p_dpopis> 
<p_vyrobce>NONAME</p_vyrobce> 
    <IMGURL> 

这里是我用Perl试过的,没有任何运气:

perl -0pe 's|</p_dpopis>.*\n.*<IMGURL>|replacement|' myxml.xml 

这里有什么问题?

+2

您是否在多行匹配中搜索了其他perl问题? SO只有大约500万... – 2014-09-30 22:06:22

+0

你需要多行匹配吗? ''是否出现在文件的其他地方? – 2014-09-30 22:13:17

+0

@EtanReisner,是的! – Adrian 2014-09-30 22:15:42

回答

0

对于您的正则表达式,您错过了“全局”修饰符,并且使用\s+来匹配任何数量的空格比指定.*\n.*容易得多。将输出发送到另一个文件也更好,而不必在终端窗口中处理它。

perl -0pe 's|</p_dpopis>\s+<IMGURL>|</p_dpopis>\n<p_vyrobce>NONAME</p_vyrobce>\n<IMGURL>|g' myxml.xml > my_new_xml.xml 

如果你正在处理XML,它是真正最好使用专用的XML解析器 - 你可以通过操纵一个不规则的语言,比如XML与正则表达式进入各种恶作剧。

1

你的语法的工作原理:

$ cat file 
</p_dpopis> 
    <IMGURL> 
$ perl -0pe 's|</p_dpopis>.*\n.*<IMGURL>|replacement|g' file 
replacement 

下面是一个例子sed用相同的示例文件:

$ sed -r '/<\/p_dpopis>/{ N; s%</p_dpopis>.*\n.*<IMGURL>%replaced\ntest%g }' file 
replaced 
test 

更多信息请参阅本reference

+0

谢谢@zerodiff,我现在试图用sed来做到这一点(我发现它更快)。这个正则表达式在regex101.com上匹配,但在sed中不起作用?这里有什么错误:sed -r -e's/<\/p_dpopis>。* \ n \ s \ s \ s \ s /miez/g'xy.xml – Adrian 2014-10-01 17:01:16

+0

@ialarmedalien我正在路上:-) http:// regex101 .com/r/tV4jJ8/1只有sed不想工作/更换相关部件。 – Adrian 2014-10-01 17:07:50

+0

我添加了一个'sed'示例和一个链接。 – zerodiff 2014-10-01 18:05:58