2013-04-10 672 views
1

我用sed命令掙扎更加特殊字符與另一個許多特殊字符替換字符串。sed命令有許多特殊字符

我有3個.SH文件,我需要替換以下:

文字來代替:

SERVER=`grep ^SERVER= file.properties | tail -1 | awk 'BEGIN { FS="="} { print $2 }'` 

替換爲以下:

SERVER=`grep ^SERVER_UI= poller.properties | tail -1 | awk 'BEGIN { FS="="} { print $2 }'` 
echo "New SERVER_UI value is ${SERVER}" 
if [ "$SERVER" == "" ] 
then 
    SERVER=`grep ^SERVER= poller.properties | tail -1 | awk 'BEGIN { FS="="} { print $2 }'` 
    echo "Old SERVER value is ${SERVER}" 
fi 

這是據我自己能夠得到,但它不工作,我會很感激一些幫助:

sed -i.bak 's,SERVER=`grep ^SERVER= file.properties | tail -1 | awk \'BEGIN { FS="="} { print $2 }\'`,SERVER=`grep ^SERVER_UI= file.properties | tail -1 | awk \'BEGIN { FS="="} { print $2 }\'`\necho "New SERVER_UI value is ${SERVER}"\nif [ "$SERVER" == "" ]\nthen\n SERVER=`grep ^SERVER= file.properties | tail -1 | awk \'BEGIN { FS="="} { print $2 }\'`\n echo "Old SERVER value is ${SERVER}"\nfi,' script.sh 

如果這個幫助也帶有一些解釋,它將不勝感激。

回答

0

我想我想通了:

sed -i.bak 's,SERVER=`grep ^SERVER= file.properties | tail -1 | awk '"'"'BEGIN { FS=\"=\"} 
{ print $2 }'"'"'`,SERVER=`grep ^SERVER_UI= file.properties | tail -1 | awk '"'"'BEGIN 
{ FS=\"=\"} { print $2 }\'"'"'`\necho \"New SERVER_UI value is ${SERVER}\"\nif [ \" 
$SERVER\" == \"\" ]\nthen\n SERVER=`grep ^SERVER= file.properties | tail -1 | awk 
'"'"'BEGIN { FS=\"=\"} { print $2 }'"'"'`\n echo \"Old SERVER value is ${SERVER}\" 
\nfi,' script.sh 

我不得不逃避所有的雙引號\」

所有單引號「 '''''(單引號單引號單引號雙引號單引號)

和所有換行符\ n

+0

或只需更換每一個 「^ SERVER =。*」 與 「SERVER = $替換」? – 2013-04-10 11:00:27

+0

這個sed操作是我必須對自動下載的腳本執行多次操作,所以我不能在執行sed命令之前修改原始腳本。 – EKI 2013-04-10 14:31:55

+1

我的意思是,做一個sed,而不是尋找一個複雜的'SERVER = ..........',尋找'SERVER =。*'? (但要小心,因爲它可能會導致替換其他行...這就是爲什麼我說「^ SERVER =。*「,而不是如果你知道這是在一行的開頭(並且只有一次)) – 2013-04-10 15:54:11

2

首先你有很多鏈接在一起,你可以在單一的awk命令很容易做到的命令。因此,而不是:

grep ^SERVER_UI= poller.properties | tail -1 | awk 'BEGIN { FS="="} { print $2 }' 

您可以使用此awk命令:

awk -F= '$1=="SERVER_UI"{val=$2} END{print val}' poller.properties 

現在,一旦被解決,你應該用下面的命令你的路徑中創建一個新的腳本文件subscript.sh(從你的命令增強) :

#!/bin/bash 
SERVER=$(awk -F= '$1=="SERVER_UI"{val=$2} END{print val}' poller.properties) 
echo "New SERVER_UI value is ${SERVER}" 
if [ "$SERVER" == "" ] 
then 
    SERVER=$(awk -F= '$1=="SERVER"{val=$2} END{print val}' poller.properties) 
    echo "Old SERVER value is ${SERVER}" 
fi 

最後運行的sed命令用新subsscript.sh調用來替換舊的命令:

sed -i.bak 's#SERVER=`grep ^SERVER= file.properties | tail -1 | awk '"'"'BEGIN { FS="="} { print $2 }'"'"'`#subscript.sh#' script.sh 
+0

這個sed操作是我必須對自動下載的腳本進行多次操作,所以我不是自由的在執行sed命令之前修改原始腳本 – EKI 2013-04-10 14:29:07

+0

是的,沒有問你要修改你的腳本,這只是一個建議。我建議的sed替換命令可以在任何情況下工作。 – anubhava 2013-04-10 14:31:57