我需要帮助来编写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'
但问题是,我需要在远程主机上保留原始设置]令牌并且只替换服务器部分。
答案 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之后。当所有已完成的临时文件被删除时。