我有一个我正在编辑的配置文件,在第一次传递时,它被正确更改,但在接下来的两行中,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=
无法弄清楚这有什么问题。任何帮助都会很棒。
谢谢!
答案 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