sed在第二次传球时返回空线

时间:2012-11-06 23:17:41

标签: url variables sed substitution

我有一个我正在编辑的配置文件,在第一次传递时,它被正确更改,但在接下来的两行中,sed将这些行返回空白。

要编辑的行是

word.word.word.database=dbase
word.word.word.username=someone
word.word.word.password=someone

我正在使用的sed命令是

cat config.file | \sed -e "s/database/$dbname/" > config.file.1

cat config.file.1 | \sed -e "s/username/$dbuser/" > config.file.2

cat config.file.2 | \sed -e "s/database/$password/" > config.file.3

 cp config.file.3 config.file

最终结果是

word.word.word.database=dbname
word.word.word.username=
word.word.word.password=

无法弄清楚这有什么问题。任何帮助都会很棒。

谢谢!

1 个答案:

答案 0 :(得分:1)

$dbname$dbuser$password开始被视为shell变量,因此是主要的美元符号。如果您正在尝试合并shell变量,请尝试:

 sed -i -e "s/database/$dbname/" -e "s/username/$dbuser/" -e "s/password/$password/" config.file

请注意,我已将-i标志添加到上述命令中。它使用GNU sed启用就地编辑。其他类型的sed需要设置扩展名,例如:-i.bak,这会创建一个备份文件;在您的情况下,这将是:config.bak

如果您只是想获得完整的结果列表,请删除美元符号或使用单引号。例如:

sed -i -e "s/database/dbname/" -e "s/username/dbuser/" -e "s/password/password/" config.file

sed -i -e 's/database/$dbname/' -e 's/username/$dbuser/' -e 's/password/$password/' config.file

<强> EDIT1:

如果我完全误解了你的问题,请试试这个:

sed -i -e "s/\(.*database=\).*/\1dbname/" -e "s/\(.*username=\).*/\1dbuser/" -e "s/\(.*password=\).*/\1password/" config.file

结果:

word.word.word.database=dbname
word.word.word.username=dbuser
word.word.word.password=password

<强> EDIT2:

如果您的shell变量标记为$dbname$dbuser$password

sed -i -e "s/\(.*database=\).*/\1$dbname/" -e "s/\(.*username=\).*/\1$dbuser/" -e "s/\(.*password=\).*/\1$password/" config.file