提问人:derwian36 提问时间:11/4/2022 最后编辑:brian d foyderwian36 更新时间:11/4/2022 访问量:115
如何使用 Bash 替换字符串后的所有内容?
How can I replace everything after a string using Bash?
问:
我有一个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赞
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
评论
COOLVAR
COOLVAR="Initial value for COOLVAR"
Can't modify constant item in scalar assignment