【Linux】基于sed正则指令修改application.properties属性值

文章目录

    • 背景
    • sed介绍
    • 演示
    • 结果


背景

服务器上搭建了SpringCloud微服务,每个服务中都有application.properties文件,在部署过程中需要修改每个微服务的redis.ip和redis.port。如果手动去修改会很麻烦,所以下面写了一个shell脚本(基于sed 扩展正则表达式)

本案例仅以修改单个application.properties为例,读者后续可以在脚本加上读取各个服务中的application.properties 文件地址,然后批量修改即可。

sed介绍

sed、grep、awk是Linux的文本三剑客,具有强大的功能。sed 全名为 Steam Editor,是一种流式编辑器,它支持正则表达式和扩展正则表达式。
sed指令读取file.txt文件后,按行读取,并将内容存入模式空间(缓存),再输出到终端界面上。

【Linux】基于sed正则指令修改application.properties属性值_第1张图片

演示

为了演示,application.properties放了redis的两个参数
【Linux】基于sed正则指令修改application.properties属性值_第2张图片

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
  • /g 代表更改模式,g代表global,全局修改。所有匹配到的模式都将被替换。

注意:上面的指令执行后,并没有更改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'
~                        
  • 方法中将用户传入的变量ip和port存入到temp,是因为后面的 sed -i 指令末尾,需要指定文件名,而无法用变量值去替换。所以将变量存入到了文件中。
  • 还有一点需要注意的是,值是通过变量传入的,如果写成"$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中,配置庞大而复杂,如果手动去找指定配置参数并修改会非常麻烦。读者可以根据上述的方法步骤,修改成自己想要的结果。

你可能感兴趣的:(Linux,linux,ssh,运维,服务器)