2016-08-23 50 views
2

在Linux Vm中,我試圖更改50+文件的第二行。perl -p -i -e用包含符號的文本替換行

我已經成功地將下面的這個命令用於沒有符號的字符串。

perl -p -i -e 's/.*/new_line/if $.==2' . 

但是我現在想添加新字符串 「#$ NEW_LINE $」 使用下面的命令:

perl -p -i -e 's/.*/# $Header$/if $.==2' . 

但得到以下錯誤:

Final $ should be \$ or $name at -e line 1, within string 
syntax error at -e line 1, near "s/.*/# $Header$ /" 
Execution of -e aborted due to compilation errors. 

任何幫助讚賞。先謝謝你。

+0

使用:'perl -pie's /.*/# \ $ Header \ $/if $。== 2'' – anubhava

+0

感謝Bunch Anuchava,它工作正常! :) perl -pie的/.*/# \ $ Header \ $/if $。== 2'。 – user5511576

+0

@ anubhava的例子非常有效,除了它將兩行替換爲一行,因爲///不會替換字符串末尾的「\ n」。 –

回答

5

錯誤消息告訴你什麼是錯的:

Final $ should be \$ or $name at -e line 1, within string 

你需要躲避$秒。它將第二個$看作變量的一部分,但事實並非如此。

您還需要躲避第一$因爲Perl認爲$Header作爲變量,並將替代的$Header值而不是實際的字符串$Header的。由於$Header沒有任何價值,你只會得到一個空字符串。

您也不能指定.作爲要操作的文件。 .是一個目錄,和Perl會告訴你,如果你嘗試使用它作爲一個文件:

Can't do inplace edit: . is not a regular file. 

你也想用-l標誌,以確保Perl的正確處理行尾。當用新字符串替換整個字符串時,最後不包括\n

所以,你想要的是:

perl -l -p -i -e 's/.*/# \$Header\$/if $.==2' *.html 

(用自己的文件規範替​​換*.html

最後,你也只是你想要的字符串替換工作變量$_,而不是使用s///,像這樣:

perl -l -p -i -e '$_ = q{# $Header$} if $.==2' * 

q{xyz}相同'xyz',WHE沒有內插完成。

+1

感謝您的解釋!我現在知道了!得到它的工作:) – user5511576