用于替换令牌的表达式

时间:2014-03-09 11:07:42

标签: bash shell

我需要帮助来编写bash脚本,其中一个部分有一个任务是在这些令牌之间插入文本 - 首先发生{和最后关闭] 真实如下

{  <-----here start
"pools" : [
        {
                "url" : "stratum+tcp://server:3333",
                "user" : "User",
                "pass" : "x"
        },

        {
                "url" : "stratum+tcp://server1:3333",
                "user" : "User",
                "pass" : "x"

        }
] <-----here end

我的脚本旨在为多个服务器插入池配置。贝娄最后关闭]还有其他设置应保持不变。

我找到了一个解决方案,它在定义的标记之间提取文本,表达方式如下:

sed -n '/{/{:a;n;/]/b;p;ba}' input.txt

但我的任务有点复杂。我需要更换远程主机配置

{
"pools" : [
        {
                "url" : "stratum+tcp://server:3333",
                "user" : "User",
                "pass" : "x"
        },

        {
                "url" : "stratum+tcp://server1:3333",
                "user" : "User",
                "pass" : "x"

        }
]
some settings
.......
another seetings
}

使用新服务器设置

{  
"pools" : [
        {
                "url" : "stratum+tcp://anotherserver:3333",
                "user" : "User",
                "pass" : "x"
        },

        {
                "url" : "stratum+tcp://anotherserver1:3333",
                "user" : "User",
                "pass" : "x"

        }
]

我可以在远程主机上追加/替换新配置,如下所示

echo '{
"pools" : [
        {
                "url" : "stratum+tcp://anotherserver:3333",
                "user" : "User",
                "pass" : "x"
        },

        {
                "url" : "stratum+tcp://anotherserver1:3333",
                "user" : "User",
                "pass" : "x"

        }
]'| ssh root@$HOST -p $PORT 'cat > /remotehost/config.conf'

但问题是,我需要在远程主机上保留原始设置]令牌并且只替换服务器部分。

1 个答案:

答案 0 :(得分:0)

我只用bash完成了我的任务。也许它不优雅,因为使用了临时文件,但效果很好。

cat <<'EOF' | ssh root@$HOST -p $PORT 'cat - > /tmp/pool.tmp && sed -n "/]/{:a;n;/}/b;p;ba}" /etc/bamt/cgminer.conf > /tmp/cgminer.conf.tmp \
&& cat /tmp/pool.tmp /tmp/cgminer.conf.tmp > /etc/bamt/cgminer.conf && echo "}" >> /etc/bamt/cgminer.conf \
&& rm /tmp/pool.tmp /tmp/cgminer.conf.tmp'  
{
"pools" : [
        {
                "url" : "stratum+tcp://server:3333",
                "user" : "User",
                "pass" : "x"
        },

        {
                "url" : "stratum+tcp://server1:3333",
                "user" : "User",
                "pass" : "x"

        }
]
EOF

解释

脚本中的整个服务器部分转到/tmp/pool.tmp(远程服务器),然后在服务器端提取下面的所有设置]令牌到临时文件cgminer.conf.tmp。将两个临时文件连接到一个单独的cgminer.conf之后。当所有已完成的临时文件被删除时。