我想要做:
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。因此,某些符号(如 `)在使用前必须进行转义。