服务器上搭建了SpringCloud微服务,每个服务中都有application.properties
文件,在部署过程中需要修改每个微服务的redis.ip和redis.port。如果手动去修改会很麻烦,所以下面写了一个shell脚本(基于sed 扩展正则表达式)
本案例仅以修改单个application.properties为例,读者后续可以在脚本加上读取各个服务中的application.properties
文件地址,然后批量修改即可。
sed、grep、awk是Linux的文本三剑客,具有强大的功能。sed 全名为 Steam Editor,是一种流式编辑器,它支持正则表达式和扩展正则表达式。
sed指令读取file.txt文件后,按行读取,并将内容存入模式空间(缓存),再输出到终端界面上。
为了演示,application.properties
放了redis的两个参数
sed -i " s/匹配的内容/修改内容/g " 文本
sed -i 参数,i是直接编辑原本的文件,匹配模式匹配到指定文件
如果只是修改简单的字符串,不涉及到.
,*
, \
等特殊字符,例如使用sed指令修改上面的 redis.port
端口,可以直接执行:
[fy36@localhost app]$ sed -E 's/^redis.port=.*/redis.port=1234/g' application.properties
redis.ip=198.14.3.12
redis.port=1234
解析:上面的代码中
^redis.port=.*
其中的^redis.port
表示开头必须是redis.port
,.
表示,匹配除了换行符之外的任意字符*
表示前面匹配字符可以出现0次或多次/
表示要被替换的字符,也就是将redis.port改为1234注意:上面的指令执行后,并没有更改application.properties文件内容,它只是将修改后的预览效果
呈现在了屏幕上。除非使用"-i"选项才会直接修改文件。
直接修改application.properties :
sed -i 's/^redis.port=.*/redis.port=1234/g'
现在,将上述方法封装成函数
#! /bin/bash
function redisConfig(){
# 配置reids 的ip和端口
REDIS_IP=$1
REDIS_PORT=$2
# input the variable 's value into the file "abc.txt" 下面的指令会将变量值写入到 temp.txt,如果temp.txt不存在就会自动创建
echo "$REDIS_IP" >temp.txt
#"all the '\' are used to transform the character '.'",也就是使用反斜杠\字符,将字符中的`.` 转义成 '.'本意,而不是被sed指令解析为正则表达式。
sed -i 's/\./\\./g' temp.txt
# 读取文件中ip,将值写入到变量value.
REDIS_IP=$(cat < temp.txt)
echo '删除临时文件temp.txt'
# 删除当前目录下生成的临时文件temp
rm ./temp.txt
# 关于变量,需要使用 单引号''包含变量,否则将被识别为字符串
sed -i 's/^redis.ip=.*/redis.ip='$REDIS_IP'/g' application.properties
sed -i 's/^redis.port=.*/redis.port='$REDIS_PORT'/g' application.properties
}
# 调用上述方法,修改
redisConfig 182.141.11.143 '1124'
~
"$REDIS_IP"
,它只会被识别成普通字符串.[fy36@localhost app]$ sh setproperties.sh
删除临时文件temp.txt
[fy36@localhost app]$ cat application.properties
redis.ip=182.141.11.143
redis.port=1124
[fy36@localhost app]$
在实际的application.properties中,配置庞大而复杂,如果手动去找指定配置参数并修改会非常麻烦。读者可以根据上述的方法步骤,修改成自己想要的结果。