• dockerentrypoint.sh中sed i命令


    参考文档: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;
        }
  • 相关阅读:
    python发送邮件
    nginx的信号量和平滑升级
    CentOS6下nginx的源码安装
    mysql备份与还原之mysqldump
    myslq基本语法(3)
    mysql基本语法(2)
    MySQL中数据表和数据的操作
    mysql概述及基本语法(1)
    shell的随机数
    浏览器的跨域问题的解决办法
  • 原文地址:https://www.cnblogs.com/zwh0910/p/16425741.html
Copyright © 2020-2023  润新知