sed命令在命令提示符下按预期工作,但在shell脚本中不起作用。
new_db_name=`echo "$new_db_name" | sed 's/$replace_string/$replace_with/'`
为什么会这样,我该如何解决?
答案 0 :(得分:47)
对sed
表达式使用双引号。
new_db_name=`echo "$new_db_name" | sed "s/$replace_string/$replace_with/"`
答案 1 :(得分:5)
如果你使用bash,这应该有效:
new_db_name=${new_db_name/$replace_string/$replace_with}
答案 2 :(得分:4)
这对我使用env参数很有用。
export a=foo
export b=bar
echo a/b | sed 's/a/'$b'/'
bar/b
答案 3 :(得分:1)
伙计们:我使用以下命令将bash变量传递给使用sed的bash脚本中的函数。即,我将bash变量传递给sed命令。
#!/bin/bash
function solveOffendingKey(){
echo "We will delete the offending key in file: $2, in line: $1"
sleep 5
eval "sed -i '$1d' $2"
}
line='4'
file=~/ivan/known_hosts
solveOffendingKey $number $file
亲切的问候!
答案 4 :(得分:0)
取决于变量的初始化方式,最好使用括号:
new_db_name=`echo "$new_db_name" | sed "s/${replace_string}`/${replace_with}/"
也许我错过了一些东西,但new_db_name=echo "$new_db_name"
在这里没有意义。 $ new_db_name为空,因此您将回显null结果,然后是sed命令的输出。要将stdout捕获为变量,不建议使用反引号。捕获由$()
包围的输出。
new_db_name=$(sed "s/${replace_string}/${replace_with}/")
采用以下示例:
replace_string="replace_me"
replace_with=$(cat replace_file.txt | grep "replacement_line:" | awk FS" '{print $1}')
其中replace_file.txt可能类似于:
old_string: something_old
I like cats
replacement_line: "shiny_new_db"
在sed expresion $replace_with
中使用变量是行不通的。 bash没有足够的上下文来转义变量表达式。 ${replace_with}
告诉bash显式使用变量发出的命令的内容。