我想把文件中包含$符号的字符串替换为另一个字符串,该字符串也包含$符号和bash变量的值。
$Rev: 12345 $ $Author: 12345 $
假设我有一个名为i
的bash变量,其中包含字符串foo
。现在我想用$Rev: $i $
替换$Rev: 12345 $
。我尝试使用sed,但由于sed不支持非贪婪正则表达式,因此我切换到了perl。当我不使用任何bash变量时,Perl工作正常。
# cat file
$Rev: 12345 $ $Author: 12345 $
# perl -p -i -e 's;\$Rev:.*?\$;\$Rev: test \$;g' file
# cat file
$Rev: test $ $Author: 12345 $
但是,无论我如何摆脱命令中的$符号,我都无法让它与bash变量一起工作。
# cat file
$Rev: 12345 $ $Author: 12345 $
# i="foo"
# echo $i
foo
# perl -p -i -e "s;\$Rev:.*?\$;\$Rev: $i \$;g" file
Final $ should be \$ or $name at -e line 1, within string
syntax error at -e line 1, near "s;$Rev:.*?$;$Rev: foo $;g"
Execution of -e aborted due to compilation errors.
# perl -p -i -e "s;\\$Rev:.*?\\$;\$Rev: $i \\$;g" file
# cat file
$Rev: foo $ $Author: foo $
谢谢你的帮助!
2条答案
按热度按时间fquxozlt1#
最好在Perl中使用Perl变量,而不是让shell将其变量扩展到Perl代码中。
然后,您可以在代码周围使用单引号,这使得正确地反斜杠内容变得容易得多。
-s
告诉Perl接受-var=val
开关,并在运行代码之前将Perl变量$var
设置为val
。uubf1zoe2#
尝试将
$i
完全置于引号之外:或者,您可以将变量
export
到子进程,并通过Perl中的%ENV
散列访问它: