sed脚本中的Shell变量

时间:2011-08-10 06:52:40

标签: sed

sed命令在命令提示符下按预期工作,但在shell脚本中不起作用。

new_db_name=`echo "$new_db_name" | sed 's/$replace_string/$replace_with/'`

为什么会这样,我该如何解决?

5 个答案:

答案 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显式使用变量发出的命令的内容。