参考文档:https://www.cnblogs.com/liwei0526vip/p/5644163.html
一、简介
sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作。
sed 全名为 stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大。是贝尔实验室的 Lee E.McMahon 在 1973 年到 1974 年之间开发完成,目前可以在大多数操作系统中使用,sed 的出现作为 grep 的继任者。与vim等编辑器不同,sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。sed 基本上就是在玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。
二、基本子命令
1、子命令s
子命令s为替换子命令,是平时sed使用的最多的子命令,没有之一。因为支持正则表达式,功能变得强大无比,下边来详细地说说子命令s的使用方法。
基本语法:
[address]s/pattern/replacement/flags
s字符串替换,替换的时候可以把/换成其它的符号,比如=,replacement部分用下列字符会有特殊含义:
>>> &:用正则表达式匹配的内容进行替换 >>> \n:回调参数 >>> \(\):保存被匹配的字符以备反向引用\n时使用,最多9个标签,标签书序从左到右
Flags
>>> n:可以是1-512,表示第n次出现的情况进行替换 >>> g:全局更改 >>> p:打印模式空间的内容 >>> w file:写入到一个文件file中
三、使用
1、准备文件
linux中创建一个文件message
vi message
写入内容
hello 123 world
查看内容
[root@xxx ~]# cat message hello 123 world
2、将message每行包含的第一个hello的字符串替换为HELLO
[root@xxx ~]# sed 's/hello/HELLO/' message HELLO 123 world
3、把message文件中每行的所有w字符替换为A,默认不加g标记时只替换每行的第一个字符
[root@xxx ~]# sed 's/w/A/g' message hello 123 Aorld
4、使用了扩展正则表达式,需要加-r选项
[root@xxx ~]# sed -r 's/[a-z]+ [0-9]+ [a-z]+/A/' message A
四、sed语法和常用选项
1、语法
sed [选项] ‘command’ 文件名称
选项部分,常见选项包括-n,-e,-i,-f,-r选项。
command部分包括:[地址1,地址2] [函数] [参数(标记)]
2、选项-i
sed默认会把输入行读取到模式空间,简单理解就是一个内存缓冲区,sed子命令处理的内容是模式空间中的内容,而非直接处理文件内容。因此在sed修改模式空间内容之后,并非直接写入修改输入文件,而是打印输出到标准输出。如果需要修改输入文件,那么就可以指定-i选项。
不使用-i
[root@xxx ~]# cat message hello 123 world [root@xxx ~]# sed 's/hello/A/' message A 123 world [root@xxx ~]# cat message hello 123 world
使用-i
[root@xxx ~]# sed -i 's/hello/A/' message [root@xxx ~]# cat message A 123 world
修改的同时进行备份旧文件
[root@xxx ~]# cat message A 123 world [root@xxx ~]# sed -i.bak 's/A/B/' message [root@xxxx ~]# ll -rw-r--r-- 1 root root 13 Jun 30 09:54 message -rw-r--r-- 1 root root 13 Jun 30 09:52 message.bak [root@xxx ~]# cat message.bak A 123 world [root@xxx ~]# cat message B 123 world
把修改内容保存到message,同时会以message.bak文件备份原来未修改文件内容,以确保原始文件内容安全性,防止错误操作而无法恢复原来内容。
# 对每行匹配到的第一个字符串进行替换 sed -i 's/原字符串/新字符串/' ab.txt # 对全局匹配上的所有字符串进行替换 sed -i 's/原字符串/新字符串/g' ab.txt # 删除所有匹配到字符串的行 sed -i '/匹配字符串/d' ab.txt # 特定字符串的行后插入新行 sed -i '/特定字符串/a 新行字符串' ab.txt # 特定字符串的行前插入新行 sed -i '/特定字符串/i 新行字符串' ab.txt # 把匹配行中的某个字符串替换为目标字符串 sed -i '/匹配字符串/s/源字符串/目标字符串/g' ab.txt # 在文件ab.txt中的末行之后,添加bye sed -i '$a bye' ab.txt # 对于文件第3行,把匹配上的所有字符串进行替换 sed -i '3s/原字符串/新字符串/g' ab.txt
五、项目使用场景
场景:部署前端项目时,在Dockerfile文件中执行docker-entrypoint.sh文件,在docker-entrypoint.sh中修改nginx.conf的内容。
Dockerfile文件和docker-entrypoint.sh文件都在前端项目根目录下。
Dockerfile中部分内容如下:
ADD docker-entrypoint.sh /usr/local/ RUN chmod +x /usr/local/docker-entrypoint.sh ENTRYPOINT ["/usr/local/docker-entrypoint.sh"]
docker-entrypoint.sh文件内容如下:
#! /bin/bash if [ $ENV ]; then if [ "$ENV" = "UAT" ]; then sed -i 's/server 192.168.22.33:8888/#server 192.168.22.33:8888;/' /usr/local/nginx/conf/nginx.conf fi fi exec "$@"
nginx.conf文件部分内容如下:
upstream pts{ server 192.168.22.33:8888; }