参考文档: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;
    }

 

posted on 2022-06-30 10:16  周文豪  阅读(1056)  评论(1编辑  收藏  举报