如何使用 Bash 替换字符串后的所有内容?

How can I replace everything after a string using Bash?

提问人:derwian36 提问时间:11/4/2022 最后编辑:brian d foyderwian36 更新时间:11/4/2022 访问量:115

问:

我有一个Perl脚本,它使用一些局部变量,如下所示:

my $cool_variable="Initial value";
COOLVAR="Initial value for COOLVAR"

我想使用 bash 脚本替换引号之间的内容。

我让它适用于如下所示的非变量:

#!/bin/sh
dummy_var="Replaced value"
sed -i -r "s#^(COOLVAR=).*#\1$dummy_var#" perlscript.pl

但是,如果我用 cool_variable 或 $cool_variable 替换它:

sed -i -r "s#^($cool_variable=).*#\1$dummy_var#" perlscript.pl

它不起作用..

与语言无关

评论

1赞 chepner 11/4/2022
与其编辑 perl 脚本,不如让它从配置文件中读取必要的值,这可以像包含所需文本的文本文件一样简单。然后Perl脚本只需要读取文件的内容即可初始化。COOLVAR
0赞 TLP 11/4/2022
这应该在你的Perl代码中是什么:.如果我尝试运行该代码,则会出现编译错误。COOLVAR="Initial value for COOLVAR"Can't modify constant item in scalar assignment

答:

1赞 ikegami 11/4/2022 #1

该代码段中有多个代码注入 bug。不应从 shell 或 sed 生成代码。


假设你有

var=COOLVAR
val=coolval

根据如何在 -n 或 -p 模式下使用 Perl 处理选项?,您可以使用以下任何一种

perl -spe's{^$var=\K.*}{"\Q$val\E";};' -- -var="$var" -val="$val" perlscript.pl
var=var val=val perl -pe's{^$ENV{var}=\K.*}{"\Q$ENV{val}\E";};' perlscript.pl
export var
export val
perl -pe's{^$ENV{var}=\K.*}{"\Q$ENV{val}\E";};' perlscript.pl

转换

COOLVAR="dummy";
HOTVAR="dummy";

COOLVAR="coolvar";
HOTVAR="dummy";

这些值使用参数传递给程序,以避免将它们注入到修复器中,并且修复器使用 Perl(又名 \Q..\E) 引用特殊字符。quotemeta

请注意,这假定为有效的标识符。不执行验证检查。使用不受信任的输入,此程序绝对不安全。$var

用于就地修改文件。-i