• Sed命令的使用小结


    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
    💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
    ❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
    ❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
    ❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
    😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
    全网同名【码农飞哥】欢迎关注,个人VX: wei158556

    1. 简介

    上一篇文章我们介绍了Shell 脚本的编写总结,这篇文章单独介绍另一个使用频率比较高的命令:sed命令

    2. sed的概念

    sed(Stream Editor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等)。最后输出所有行或者仅输出处理的某些行,sed可以在无交互的情况下实现比较复杂的文本处理操作,被广泛应用于shell脚本,用以完成各种自动化处理任务。
    sed的工作流程主要包括读取、执行和显示三个过程。
    读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
    执行:默认情况下,所有的sed命令都是在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
    显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
    在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

    注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

    sed命令有三个特性:

    1. 非交互式:处理文件时,把当前处理的行存储到临时缓冲区(又称模式空间,pattern space),即它是基于模式
    2. 逐行处理:sed命令在缓冲区中一次处理一行内容,处理完成之后,把缓冲区的内容送往屏幕,接着处理下一行,直到文件末尾。
    3. 正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,**而并不会对原始文件做任何更改。**若希望直接修改文件内容,应添加选项 -i 。为了避免生产环境中因误操作导致系统故障,使用时要谨慎。

    3. sed的图示

    sed的数据流向图如下图所示:
    在这里插入图片描述

    4. sed命令的格式

    sed命令的格式有两种:

    1. 格式一 :前置命令|sed [选项] ‘[定位符]处理动作’ [input-file]
      sed命令可以与其他命令组合使用,将前置命令和sed命令通过| 组合使用。
    2. 格式二:sed [选项] ‘[定位符]处理动作’ 文件 [input-file]
      其中,处理动作可以由-e指定多个处理动作,input-file为输入文件,可以指定多个。
      如果忘记了命令格式,可以执行 sed --help 命令进行查看
      在这里插入图片描述
      下面就sed命令的语法进行一下介绍:

    4.1. 选项说明

    选项是非必选的,就是说可以为空

    选项说明
    -n安静模式,取消自动打印模式空间
    -e脚本,添加"脚本" 到程序的运行列表
    -f脚本文件,添加"脚本文件"到程序的运行列表
    -i直接编辑原始文件
    -r启动扩展的正则表达式,若与其他选项
    -s将输入文件视为各个独立的文件而不是一个长的连续输入

    4.2. 动作说明

    [n1[,n2]] function 
    
    • 1

    其中:[n1[,n2]] 称为定位符,用来定义需要操作的文本,如指定处理的起、止行数。
    n1,n2不见得会存在,一般代表"选择进行动作的行数",举例来说,如果我的动作需要从2行号10行之间进行,则写作"2,4动作行为"。例如:

    sed -n "2,4p" sedtest.txt 
    
    • 1

    在这里插入图片描述

    地址可表示为文本的"行号",或者用来匹配的"/正则表达式/",例如:

    sed -n "/码农飞哥/p" sedtest.txt 
    
    • 1

    在这里插入图片描述

    省略定位符时,默认逐行处理全部文本。
    function 为编辑指令,可以为增删改查等指令

    function说明
    a新增(append),a的后面可以接字符串,而这些字符串会在新的一行出现,(当前行后面添加一行文本)
    c取代(change),c的后面可以接字符串,这些字符串可以取代n1,n2之间的行
    d删除(delete),后面不需要接任何字符串
    i插入(insert),行前插入文本,i的后面可以接字符串,而这些字符串会在新的一行出现(在当前行的上面插入一行)
    p打印(print),行前插入文本,i的后面可以接字符串,而这些字符串会在新的一行出现(在当前行的上面插入一行)
    s字符串替换(substitution),将s后的老文本替换成新文本

    5. 举例说明

    原始文本:
    在这里插入图片描述

    5.1. 输出文本

    5.1.1. 输出所有文本

    sed -n 'p' sedtest.txt
    
    • 1

    在这里插入图片描述

    5.1.2. 输出某一行

    #输出第4行
    sed -n '4p' sedtest.txt
    #输出最后一行
    sed -n '$p' sedtest.txt
    #输出第2行到最后一行
    sed -n '2,$p' sedtest.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    5.1.3. 利用正则表达式输出

    #查询包含Python的文本
    sed -n '/Python/p' sedtest.txt
    #查询以“应有尽有” 结尾的文本
    sed -n '/应有尽有$/p' sedtest.txt
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    5.1.4 输出奇偶数行

    #输出奇数行
    sed -n '1~2p' sedtest.txt
    #输出偶数行
    sed -n '2~2p' sedtest.txt
    
    • 1
    • 2
    • 3
    • 4

    6. 删除文本

    #删除所有行
    sed -i 'd' sedtest-bak.txt
    #删除第4行
    sed -i '4d' sedtest-bak.txt
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    7. 替换文本

    #将每行中第1个Python替换成PYTHON
    sed -i 's/Python/PYTHON/' sedtest-bak.txt
    #将所有的的Java替换成 JAVA
    sed -i 's/Java/JAVA/g' sedtest-bak.txt
    #将第2行的PYTHON替换成 python
    sed -i '2s/PYTHON/python/2' sedtest-bak.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    8. 行前行后插入文本

    8.1. 行前插入文本

    #在第2行前插入单行文本
     sed -i '2i 码农飞哥最棒' sedtest-bak.txt
    #在  2. PYTHON爬虫专栏 前插入多行文本
    sed -i '/2. PYTHON爬虫专栏/i\码农飞哥加油\n码农飞哥一定能成功' sedtest-bak.txt	
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述在这里插入图片描述

    8.1. 行后插入文本

    #在第2行后插入单行文本
    sed -i '2a feige最棒' sedtest-bak.txt
    #在  JAVA高并发编程入门 前插入多行文本
    sed -i '/JAVA高并发编程入门/a\feige加油\nfeige一定能成功' sedtest-bak.txt	
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    参考

    sed命令详解+示例

  • 相关阅读:
    【C++】你看懂C++的类和对象了么
    跌宕奔流2022,自动驾驶江湖风起雨涌,特斯拉、毫末、华为突破重围
    IB学生喜欢申请哪些英国院校?
    【正点原子I.MX6U-MINI应用篇】9、嵌入式Linux中的多线程编程pthread
    LeetCode(力扣)55. 跳跃游戏Python
    d合并json
    如何以最快速度将Vue接入在线客服系统?
    Go语言 结构体
    fcpx插件:82种复古电影胶卷框架和效果mFilm Matte
    板块一 Servlet编程:第七节 ServletContext对象全解与Servlet三大域对象总结 来自【汤米尼克的JAVAEE全套教程专栏】
  • 原文地址:https://blog.csdn.net/u014534808/article/details/126341738