perl -p -i -e用包含符号的文本replace行

在Linux Vm中,我试图改变50+文件的第二行。

我已经成功地将下面的命令用于没有符号的string。

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

但是现在我试图使用这个命令添加新的string“#$ 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. 

任何帮助表示赞赏。 先谢谢你。

错误消息告诉你到底什么是错的:

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

你需要逃避$ s。 它看到第二个$作为变量的一部分,但事实并非如此。

您还需要转义第一个$因为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 

(用你自己的filespec替换*.html

最后,你也可以用你想要的字符串替换工作变量$_而不是使用s/// ,如下所示:

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

q{xyz}'xyz'是一样'xyz' ,没有内插。