2017-05-04 11 views
-1

我有一個恢復數據庫轉儲的腳本。作爲參數,數據庫名稱被傳遞給該腳本。在轉儲存在以下行:通過腳本和sed更改文件中的一行字符串

ALTER DATABASE `previosDbName` CHARACTER ... ; 

我必須要改變previosDbName的值,作爲參數傳遞。我嘗試使用sed,但它不起作用。 這裏是一個腳本:

echo $3 

export updateValue="ALTER DATABASE \`$3\`" 

echo $updateValue 

sed -i 's/ALTER DATABASE `\(.*\)`/${updateValue}/' $4 

在這裏,我怎麼運行它:

./test.sh dbP dbN medi_6_0 full_path_to_test.sql 

腳本的輸出告訴我們,updateValue是正確的:

medi_6_0 
ALTER DATABASE `medi_6_0` 

但結果字符串:

${updateValue} CHARACTER ...; 

相反的:

ALTER DATABASE `medi_6_0` CHARACTER ...; 

我也嘗試使用雙引號,但它並沒有幫助:

sed -i 's/ALTER DATABASE `\(.*\)`/"${updateValue}"/' $4 

更新:通過@Sundeep提供解決方案幫助:

sed -i 's/ALTER DATABASE `\(.*\)`/'"${updateValue}"'/' $4 

沒有描述的解決方案: How to use variables in a command in sed? 幫助。由於大多數解決方案(沒有檢查全部),在這個主題中提供。

+1

單引號內的雙引號只是另一個角色,也不會做變量替換...嘗試'''S/ALTER DATABASE'\( 。* \)'/'「$ {updateValue}'''/''' – Sundeep

+0

試一試'sed -i -E」s/ALTER DATABASE(。*)/ $ updateValue /「$ 4' –

+0

@Sundeep,only您的解決方案幫助非常感謝你! – Alexandr

回答

0

您可以使用:

sed -iE "s/(ALTER DATABASE \`).*(\`)/\1$3\2/" file.sql 
  • 用雙引號,這樣「$ 3」可以通過外殼
  • 逃避反引號擴展,否則它會告訴殼執行之間`和`文本作爲命令。
0

允許使用雙引號將可變插值括起來sed表達式。
另外,反碼`符號有特殊的含義。評估反引號之間的所有內容。

ALTER DATABASE `medi_6_0` CHARACTER ... ; 
+0

當前輸出是: ALTER DATABASE'ALTER DATABASE'medi_6_0'' CHARACTER .... – Alexandr

+0

@Alexandr,那是因爲您已經使用過您的舊'updateValue'變量,請按我的答案中的指定使用我的 – RomanPerekhrest

0

bash變量只能雙引號backtick需要擴大內部進行轉義,即:所以應該用反斜槓\

... 
export updateValue="$3" 
sed "s/\(ALTER DATABASE\) \`.*\`/\1 \`$updateValue\`/" $4 
... 

輸出轉義:

sed -i "s/\(ALTER DATABASE\) \`.*\`/\1 \`$3\`/" $4 
# ALTER DATABASE `medi_6_0` CHARACTER ... ; 

選項:

-i  Edit files in-place (otherwise sends to stdout) 
相關問題