2012-11-06 48 views
0

我有一個配置文件,我正在編輯,並在第一遍正確更改,但在接下來的兩行sed返回行空白。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

$dbname,$dbuser$password開始像殼變量一樣對待,因此是美元的前兆。如果你試圖將外殼瓦爾,嘗試:

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 
+0

我使用的是Linux的shell腳本,我在變量從閱讀文件。這就是爲什麼美元符號在那裏。但是1的功能與$符號相同嗎? – user1794918

+0

@ user1794918:否; '\ 1'用於[保留部分匹配模式](http://www.grymoire.com/Unix/Sed.html#uh-4)。我明白你想在這裏做什麼。我添加了美元符號,以便'sed'可以解釋這些變量。請參閱編輯。 – Steve

+0

最後一件事。我現在正在使用的整個命令是 – user1794918

相關問題