2012-03-22 303 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