0

我有一个正在编辑的配置文件,并且在第一次通过时已正确更改,但在接下来的两行中,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=

无法弄清楚这是怎么回事。任何帮助都会很棒。

谢谢!

4

1 回答 1

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

编辑1:

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

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

编辑2:

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

sed -i -e "s/\(.*database=\).*/\1$dbname/" -e "s/\(.*username=\).*/\1$dbuser/" -e "s/\(.*password=\).*/\1$password/" config.file
于 2012-11-06T23:32:58.930 回答