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
替换脚本如下
脚本功能就是用于替换上述数据中的host
、port
、username
、password
、dbname
这些配置。
如下是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
的所有地方都更改调,所有最好使用唯一匹配规则。
参考
man sed
- man.net