linux - perl -p -i -e 将行替换为包含符号的文本

标签 linux bash perl symbols substitution

在 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/

相关文章:

perl - 如何在perl中读取匹配字符串上方的n行?

linux - 为持久进程临时停止守护进程而不杀死它

bash - 使用 Sed 读取目录中的最后 6 行

node.js - 无法执行二进制文件 exec 格式错误 windows bash

perl - 在 Perl 中比较日期的最佳方法是什么?

linux - Wget 中的等待功能未按预期工作

linux - 通过 NFS 和 TFTP 启动 Yocto Linux 系统时为 "mount:/dev/mqueue: must be superuser to use mount"

linux - 如何在shell脚本中隐藏oracle数据库密码

linux - 关于 i2c 设备驱动程序的困惑

javascript - Perl Cookie 不工作