在Shell脚本中使用sed替换值

65次阅读
没有评论

问题描述

Shell脚本如下所示:

FAILED_REQUEST_DIRECTORY=/bla/bla2 \java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1234 \     -jar /xyz/abc-service-1.0-SNAPSHOT.jar \     --server.port=1111 \     --server.address=127.0.0.1 \     --kafka.bootstrap.servers=10.111.11.11:3197,10.112.12.111:3197,10.123.44.25:3197 \     --topic.pushcrew.encryptionKey=abc-def-egh \     --spring.application.name=name-sevice \     --fb.verification.token=token \     --management.trace.include.payload=true \     --topic.pushcrew.hits=activity-logs \     --max.block.ms=1000 \     --pager.duty.api.key=apikey \     --dsn=dsn

用户想要通过一个变量将命令中的某些键的值替换掉,比如将--server.address的值替换为Shell脚本中的变量值,该如何实现呢?

用户理解如果要替换--server.address的值,可以使用以下命令:

sed -i "s#--server.address=.* #$SERVER_ADDRESS#g;

但是用户不确定如何保留替换后的空格,并且如何确保只替换等号(=)后和空格之前的部分。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

使用sed命令可以实现在Shell脚本中替换键的值。以下是一个示例命令,可以将--server.address的值替换为Shell脚本中的变量值:

sed -i "s/server.address=[^\ ].*\ /server.address=${SERVER_ADDRESS} /g"

这个命令告诉sed在搜索时,匹配不包含空格的零个或多个字符([^\ ]),直到第一个空格为止。然后将其替换为${SERVER_ADDRESS}

为了避免使用实际的要替换的值(如10.111.11.11:3197),建议使用一个标记(如###SERVER_ADDRESS###)来代替。如果出现问题,你可以使用以下命令进行后续检查:

grep "###" && exit -1

这可以避免继续使用危险的值(混合开发/预发布/生产值)。

方案2

使用Perl也可以实现这个目的。
以下是一个使用Perl的示例命令,可以将server.address的值从localhost替换为变量值:

perl -pi -e "s/server.address=localhost/server.address=${SERVER_ADDRESS}/g" file_path

这个命令将在指定的文件中将server.address的值从localhost替换为${SERVER_ADDRESS}

希望这对你有帮助!

正文完