使用包含$符号的perl字符串替换为包含$符号和bash变量的其他字符串

mfuanj7w  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(235)

我想把文件中包含$符号的字符串替换为另一个字符串,该字符串也包含$符号和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 $

谢谢你的帮助!

fquxozlt

fquxozlt1#

最好在Perl中使用Perl变量,而不是让shell将其变量扩展到Perl代码中。

perl -i~ -pe 's/^\$Rev:.*?\$/\$Rev: $i \$/g' -s -- -i="$i" file

然后,您可以在代码周围使用单引号,这使得正确地反斜杠内容变得容易得多。
-s告诉Perl接受-var=val开关,并在运行代码之前将Perl变量$var设置为val

uubf1zoe

uubf1zoe2#

尝试将$i完全置于引号之外:

perl -pi -e 's;\$Rev:.*?\$;\$Rev: '$i' \$;g' file
#           ^---------------------^  ^-----^

或者,您可以将变量export到子进程,并通过Perl中的%ENV散列访问它:

export i="foo"
perl -pi -e 's;\$Rev:.*?\$;\$Rev: $ENV{i} \$;g' file

相关问题