2016-11-14 105 views
0

類似這樣的問題:使用bash腳本修改一個文件的sed

在這樣的文件:

define('_DB_NAME_', 'anything'); 
define('_DB_USER_', 'something else'); 
define('_DB_PASSWD_', 'and another value'); 

如何使用sed替換值anything,通過參考關鍵值_DB_NAME_,_DB_USER__DB_PASSWD?(它們是未知的)來確定?3210和another

+0

是否要替換第一行的第二個參數,或者是否要替換出現的「anything」參數? – Beta

+0

我想根據鍵'_DB_NAME_' –

回答

1
sed "s/\(define('_DB_NAME_', \).*/\1'new value');/" filename 

,同樣對於其他兩個。

如果你想改變文件的位置,你可以使用-i,但你必須小心,不同版本的sed句柄有所不同。

0
sed -i -e 's/anything/newanything/g;s/something/newthing/g;s/another/newanother/' tempfile 

其中tempfile包含您的代碼。輸出看起來像這樣

define('_DB_NAME_', 'newanything'); 
define('_DB_USER_', 'newthing else'); 
define('_DB_PASSWD_', 'and newanother value'); 
+0

替換值'anything'(未知),以清晰地編輯我的問題。值「nothing」是未知的。所以我們的目標是通過引用'_DB_NAME_'來代替它# –

+0

@francoisromain啊我看到對不起我跳了一下那邊的那個 – davidejones

1

你可能想:

sed -E " 
    s/('_DB_NAME_', ')[^']+/\1ABC/ 
    s/('_DB_USER_', ')[^']+/\1DEF/ 
    s/('_DB_PASSWD_', ')[^']+/\1GHI/ 
" 

我覺得AWK是更具可讀性:

awk -F "'" -v OFS="'" ' 
    $2 == "_DB_NAME_" {$4 = "ABC"} 
    $2 == "_DB_USER_" {$4 = "DEF"} 
    $2 == "_DB_PASSWD_" {$4 = "GHI"} 
    {print} 
' 
+0

第一個用sed說:'\ 1沒有在RE中定義' –

+0

試着用'-r '而不是'-E'。你在使用什麼操作系統? –

+0

現在它在馬科斯,但最終它會運行在Linux上(我不知道,它是一個共享主機運行Apache) –