1

我正在努力使用 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

如果帮助也附带一些解释,将不胜感激。

4

2 回答 2

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使用以下命令在 PATH 中创建一个新的脚本文件(从您的命令增强):

#!/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
于 2013-04-10T10:11:17.073 回答
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

于 2013-04-10T10:09:39.373 回答