我试图寻找在一个XML文件中的一些文本替换多行文本,该文本是:搜索和白色空间
</p_dpopis>
<IMGURL>
,取而代之的是:
</p_dpopis>
<p_vyrobce>NONAME</p_vyrobce>
<IMGURL>
这里是我用Perl试过的,没有任何运气:
perl -0pe 's|</p_dpopis>.*\n.*<IMGURL>|replacement|' myxml.xml
这里有什么问题?
我试图寻找在一个XML文件中的一些文本替换多行文本,该文本是:搜索和白色空间
</p_dpopis>
<IMGURL>
,取而代之的是:
</p_dpopis>
<p_vyrobce>NONAME</p_vyrobce>
<IMGURL>
这里是我用Perl试过的,没有任何运气:
perl -0pe 's|</p_dpopis>.*\n.*<IMGURL>|replacement|' myxml.xml
这里有什么问题?
对于您的正则表达式,您错过了“全局”修饰符,并且使用\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与正则表达式进入各种恶作剧。
你的语法的工作原理:
$ 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。
谢谢@zerodiff,我现在试图用sed来做到这一点(我发现它更快)。这个正则表达式在regex101.com上匹配,但在sed中不起作用?这里有什么错误:sed -r -e's/<\/p_dpopis>。* \ n \ s \ s \ s \ s
@ialarmedalien我正在路上:-) http:// regex101 .com/r/tV4jJ8/1只有sed不想工作/更换相关部件。 – Adrian 2014-10-01 17:07:50
我添加了一个'sed'示例和一个链接。 – zerodiff 2014-10-01 18:05:58
您是否在多行匹配中搜索了其他perl问题? SO只有大约500万... – 2014-09-30 22:06:22
你需要多行匹配吗? ''是否出现在文件的其他地方? – 2014-09-30 22:13:17
@EtanReisner,是的! – Adrian 2014-09-30 22:15:42