在Bash脚本中编辑文件内容

时间:2018-08-20 18:44:54

标签: bash shell

我有一个配置。 apache zookeeper的文件,如下所示:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/zkdata
clientPort=2184
server.1=10.1.1.191:2888:3888
server.2=10.1.1.70:2889:3889
server.3=10.1.1.71:2890:3890

我创建了一个bash脚本,该脚本删除cfg文件并将其替换为与其他服务器完全相同的信息。1= IP。该IP是可变的,我很少需要更改它。我想知道是否有一种方法可以找到10.1.1.191并用例如10.1.1.192的方式替换它,而无需执行以下操作:

rm zoo.cfg
echo "tickTime=2000" >> zoo.cfg
echo "initLimit=10" >> zoo.cfg
... (and so on till...)
echo "server.1=$1:2888:3888" >> zoo.cfg
echo "server.2=10.1.1.70:2889:3889" >> zoo.cfg
echo "server.2=10.1.1.71:2890:3890" >> zoo.cfg

这是我现在的方法。删除zoo.cfg,并用新的IP替换server.1。

是否可以通过bash脚本而不是删除文件来查找并替换 server.1的IP?

2 个答案:

答案 0 :(得分:1)

您可以使用sed进行此操作:

IP=10.1.1.192
sed -i "s/^server.1=.*\$/server.1=$IP:2888:3888/g" zoo.cfg

答案 1 :(得分:0)

请考虑采取一些不同的方法,以加强正则表达式的匹配,并确保仅替换IP地址,而将其余部分保留下来。在这里,通过用括号括起来的比赛来创建3个“记忆”组。然后,在sed命令的replace部分中以数字表示形式使用这些组。

这种方法可确保以“ server.1 =“开头的行,后跟IP地址,并保存后面的所有内容,并且在更新IP时不必输入任何内容。

正则表达式解释:

^\(server\.1=\) - Group 1 is anchored to the beginning of the line and matches
                  the string "server.1=". Note the backslash takes
                  away special meaning.  The dot in reg means match any
                  character.  Here we need to match a dot itself.

\(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\) - Then, match an IP address.  4 numbers
                                         consisting of at least 1 but not more
                                         than 3 digits, separated by dots.
\(:.*?\)\$ - Group 3 is the rest of the line, starting with the colon and 
             anchored to the end of the line.

如果所有匹配项都替换为:

\1$IP\3 - remembered group 1, then the new IP address as stored in the 
          variable IP, then remembered group 3

最后:

sed -i "s/^\(server\.1=\)\(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\)\(:.*?\)\$/\1$IP\3/g" zoo.cfg