如何在 sed 替换的 LHS 和 RHS 中使用变量?

如何在 sed 替换的 LHS 和 RHS 中使用变量?

我想要做:

cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh

在我的程序中。

但我想使用变量,例如

old_run='old_name_952'
new_run='old_name_953'

我尝试过使用它们,但替换没有发生(没有错误)。我努力了:

cat update_via_sed.sh | sed 's/old_run/new_run/'
cat update_via_sed.sh | sed 's/$old_run/$new_run/'
cat update_via_sed.sh | sed 's/${old_run}/${new_run}/'

答案1

你可以这样做:

sed "s/$old_run/$new_run/" < infile > outfile

但请注意,这$old_run将被视为正则表达式,因此变量包含的任何特殊字符(例如/或 ).必须被逃脱。同样,在 中$new_run&\字符需要特殊处理,并且您必须转义/其中的 和 换行符。

$old_run如果或的内容$new_run不在您的控制之下,那么它是批判的执行转义,或者以其他方式该代码相当于代码注入漏洞

答案2

这有效:

cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/'

因为我想“重用”同一个文件,所以我实际上将它用于任何希望采用类似方法的人:

cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/' > new_update; mv -f new_update update_via_sed.sh

上面创建了一个新文件,然后删除当前文件,并将新文件重命名为当前文件。

答案3

您可以在 sed 中使用变量,只要它位于双引号(而不是单引号)中即可:

sed "s/$var/r_str/g" file_name >new_file

/如果变量中有正斜杠 ( ),则使用不同的分隔符,如下所示

sed "s|$var|r_str|g" file_name >new_file

答案4

man bash给出了关于单引号的信息

将字符括在单引号中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。

无论您在命令行上输入什么,bash 都会对其进行解释,然后将结果发送到应该发送到的程序。在这种情况下,如果您使用sed 's/$old_run/$new_run/',bash 首先会看到sed,它将其识别为$PATH变量中存在的可执行文件。可执行sed文件需要输入。 Bash 查找输入并找到's/$old_run/$new_run/'.单引号表示 bash 不解释其中的内容并按原样传递它们。因此,bash 然后将它们传递给 sed。 Sed 给出错误,因为$只能发生在行尾。

相反,如果我们使用双引号,即 ,"s/$old_run/$new_run/"那么 bash 会看到它并将其解释$old_run为变量名并进行替换(此阶段称为变量扩展)。这确实是我们所需要的。

但是,使用双引号时必须小心,因为它们首先由 bash 解释,然后交给 sed。因此,某些符号(如 `)在使用前必须进行转义。

相关内容