我想要做:
cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh
Run Code Online (Sandbox Code Playgroud)
在我的程序中。
但我想使用变量,例如
old_run='old_name_952'
new_run='old_name_953'
Run Code Online (Sandbox Code Playgroud)
我试过使用它们,但没有发生替换(没有错误)。我试过了:
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}/'
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 54
你可以这样做:
sed "s/$old_run/$new_run/" < infile > outfile
Run Code Online (Sandbox Code Playgroud)
但请注意,这$old_run
将被视为正则表达式,因此变量包含的任何特殊字符,例如/
或.
必须被转义。同样,在$new_run
、&
和\
字符需要特殊处理,您必须转义其中的/
和换行符。
如果$old_run
或的内容$new_run
不在您的控制之下,那么执行该转义至关重要,否则该代码将构成代码注入漏洞。
Mic*_*ant 32
这有效:
cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/'
Run Code Online (Sandbox Code Playgroud)
因为我想“重用”同一个文件,我实际上将它用于任何希望使用类似方法的人:
cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/' > new_update; mv -f new_update update_via_sed.sh
Run Code Online (Sandbox Code Playgroud)
上面创建了一个新文件然后删除当前文件而不是将新文件重命名为当前文件。
小智 23
你可以在 sed 中使用变量,只要它是双引号(不是单引号):
sed "s/$var/r_str/g" file_name >new_file
Run Code Online (Sandbox Code Playgroud)
如果/
变量中有正斜杠 ( ) 则使用不同的分隔符,如下所示
sed "s|$var|r_str|g" file_name >new_file
Run Code Online (Sandbox Code Playgroud)
Mic*_*ant 21
'就地' sed(使用 -i 标志)是答案。感谢彼得。
sed -i "s@$old@$new@" file
Run Code Online (Sandbox Code Playgroud)