2012-03-22 60 views
0

我试图找到和XML文档中替换字符串Perl的命令行 - 的perl -pi -e

这是我使用的代码:

perl -pi -e s/xmlNamespaceAware=\"false\"">"/xmlNamespaceAware=\"false\"">""<"Alias">"hostname"<"/Alias">"/g 

错误:

syntax error at -e line 1, near "s/xmlNamespaceAware="false">/xmlNamespaceAware="false"><Alias>webtctdm1.ecorp.cat.com</Alias" 

如果我删除/在它工作正常。

也有反正我可以写"<"Alias">"hostname"<"/Alias">"一个换行符反对的同一行提前xmlNamespaceAware="false">

感谢。

+0

shell正在使用什么? Windows的还是什么东西? – ikegami 2012-03-22 17:44:47

回答

2

这是一个字符串无望的混乱。你已经忘记逃离",你已经在</Alias>中得到了一个纯粹的/,它实际上终止了正则表达式。为什么不使用单引号字符串来保存整个事物呢?

perl -pi -e 's/xmlNamespaceAware="false">/xmlNamespaceAware="false"><Alias>hostname<\/Alias>/g' 
+0

完美....我是新手。感谢你的帮助!有没有办法让主机名<\/Alias>写入新行? – Badboy 2012-03-22 15:01:49

+0

你可以使用'\ n'来嵌入一个换行符,但是你必须切换回使用'“'来整个字符串,这会导致更多的转义,等等。 – 2012-03-22 15:03:39

+0

Dang it back to the drawing board ..谢谢 – Badboy 2012-03-22 15:11:01

3

让你的生活更轻松,与HTML/XML打交道时挑其他的分隔符比/

新行文字:

perl -pi -e ' 
s{xmlNamespaceAware="false">} 
{xmlNamespaceAware="false"> 
<Alias>hostname</Alias>}g' *.xml 

新行转义字符:

perl -pi -e ' 
s{xmlNamespaceAware="false">} 
{xmlNamespaceAware="false">\n<Alias>hostname</Alias>}g' *.xml 

都做同样的。

+0

另请参阅[TLP的答案](http://stackoverflow.com/a/9826206)如何避免使用['\ K'](http://perldoc.perl.org/perlre.html#%28%3f%3c%3dpattern%29-%5cK)重复字符串。 – daxim 2012-03-22 18:04:12

+0

Can我得到这个 的一些帮助#!/ usr/bin/perl 使用警告; 打印“请输入虚拟主机1 - 示例 - ucisha.rd.cat。com:“; my $ virtualhost1 = <>; system(”ssh -t host \“sudo su - root -c'perl -pi -es/xmlNamespaceAware = \”false \“>/xmlNamespaceAware = \”false \ “> $ virtualhost1 <\/Alias> /克/ tcserv ER/SpringSource的-TC-服务器节点/ UCISjvm/CONF/krh.xml'\ “”); -bash:-c:行0:语法附近意外的标记错误'<' -bash:-c:line 0:'perl -pi -es/xmlNamespaceAware = false>/xmlNamespaceAware = false> akdljadlk' – Badboy 2012-03-26 16:43:41

0

我认为这应该为你做,但我没有Linux盒子来试试它。使用管道作为s///的分隔符可避免需要跳出斜杠。

perl -pi -e 's|xmlNamespaceAware="false">|xmlNamespaceAware="false">\n<Alias>hostname</Alias>|g' 
+0

好吧,这就是我现在所拥有的,我得到的错误如下: – Badboy 2012-03-26 16:41:28

3

为方便起见,您可以使用\K转义字符。它将保留前面的字符串,就像查找断言一样。我还使用#作为替代正则表达式的分隔符以避免出现斜线。

perl -pi -e 's#xmlNamespaceAware="false">\K#\n<Alias>hostname</Alias>#g' 
+0

Can #!/ usr/bin/perl 使用警告; 打印“请输入虚拟主机1 - 示例 - ucisha.rd.cat.com:“; my $ virtualhost1 = <>; system(“ssh -t wast1.ecorp.cat.com \”sudo su - root -c'perl -pi -es/xmlNamespaceAware = \“false \”>/xmlNamespaceAware = \“false \”> $ virtualhost1 <\/Alias>/g/tcserv er/springsource-tc-server-node/UCISjvm/conf/krh.xml'\“”); – Badboy 2012-03-26 16:42:43