linux sed

June 19, 2019

Sed Command

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

Sed命令我目前主要是用在编写dockerfile时用于执行替换配置使用的,如果是这样的话,就不能用最小的scratch镜像,因为sed命令需要在有sh环境中执行,最小的就是alpine

当遇到不会使用的时在Linux系统上查看操作手册man sed.

替换文件中的内容

文件内容如下

比如文件中的内容是mysql的配置,功能就是替换mysql的的配置。如下就是一个典型的java使用mysql的配置。

# application.properties
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/demo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GM    T&allowMultiQueries=true&useSSL=false
spring.datasource.druid.username=test
spring.datasource.druid.password=test

替换脚本如下

脚本功能就是用于替换上述数据中的hostportusernamepassworddbname这些配置。

如下是Dockerfiele文件内容.

FROM alpine:3.9.4  
ENV DB_USER="" DB_HOST="" DB_PASSWORD="" DB_PORT="" DB_NAME=""
ENTRYPOINT ["/bin/sh","-c","sh /docker-entrypoint.sh"]

如下就是执行的脚本docker-entrypoint.sh

#! /bin/bash
# 指定文件目录
APPLICATION_NAME = "./application.properties"
sed -i "s/"
sed -i "s/127.0.0.1:3306\/demo/${DB_HOST}:${DB_PORT}\/${DB_NAME}/g" ${APPLICATION_NAME}
sed -i "s/spring.datasource.druid.username=test/spring.datasource.druid.username=${DB_USER}/g" ${APPLICATION_NAME}
sed -i "s/spring.datasource.druid.password=test/spring.datasource.druid.password=${DB_PASSWORD}/g" ${APPLICATION_NAME}

java -jar demo.java

如上就可以执行替换一些配置了。

使用Tips

  • 可以通过命令行先进行验证。
$ echo "spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/demo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GM" | sed "s/127.0.0.1:3306\/demo/127.0.0.2:3307\/test/g"
spring.datasource.druid.url=jdbc:mysql://127.0.0.2:3307/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GM

验证好了在修改一下,上面的命令少了-i命令选项和文件名,-i就是用于修改本地文件的一个选项。

  • 匹配时尽量使用能唯一命中的
$ sed "s/spring.datasource.druid.password=test/spring.datasource.druid.password=${DB_PASSWORD}/g"
$ sed "s/test/${DB_PASSWORD}/g"

如上的两个匹配规则,第一个最好,第二个会把匹配到test的所有地方都更改调,所有最好使用唯一匹配规则。

参考


LRF 记录学习、生活的点滴