【问题标题】:perl -p -i -e replace line with text containing symbolperl -p -i -e 用包含符号的文本替换行
【发布时间】:2016-12-30 16:38:21
【问题描述】:

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

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

【问题讨论】:

  • 使用:perl -pie 's/.*/# \$Header\$/ if $.==2'
  • 感谢 Bunch Anuchava,它成功了! :) perl -pie 's/.*/# \$Header\$ / if $.==2' .
  • @anubhava 的示例非常有效,只是它将两行替换为一行,因为s/// 不会替换字符串末尾的“\n”。
  • @AndyLester .* 不匹配换行符
  • @anubhava:-pie 不会做你想做的事。 Perl 使用-ie 表示您要就地替换,并将e 添加到每个备份文件名的末尾。你必须做perl -pi -eperl -p -i -e

标签: linux bash perl symbols substitution


【解决方案1】:

错误信息告诉你到底哪里出了问题:

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

(将*.html 替换为您自己的文件规范)

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

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

q{xyz}'xyz' 相同,没有进行插值。

【讨论】:

  • 感谢您的解释!我现在知道了!让它工作:)
猜你喜欢
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2016-09-18
  • 2017-01-30
相关资源
最近更新 更多