在 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'
相同,但不进行插值。
关于linux - perl -p -i -e 将行替换为包含符号的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39108136/