2013-04-10 670 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