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

时间:2016-08-23 18:17:24

标签: linux bash perl symbols substitution

在Linux Vm中,我正在尝试更改50+文件的第二行。

我已成功使用以下命令查找没有符号的字符串。

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.

感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分: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'相同,不进行插值。