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

perl -p -i -e replace line with text containing symbol

在 linux 虚拟机中,我正在尝试更改 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.

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

错误消息告诉你到底出了什么问题:

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' 相同,其中没有进行插值。