• Linux文本三剑客之sed流编辑器


    内容预知

     1.sed的相关知识及其工作流程

     1.1 sed编辑器的介绍

    1.2 sed 流编辑器的工作过程

    1.3 经典技术题

    2. sed命令格式 与选项操作符

     2.1 sed命令格式

     2.2 sed命令的常用选项

    2.3 sed命令的操作符 

     3.sed命令的打印功能

     3.1 默认打印方式

    3.1.1 无要求的默认打印 

    3.1.2 打印时对行号的操作 

    3.2 sed命令的寻址打印

    3.2.1 以数字形式打印行区间

     3.2.2 文本模式过滤行内容

     4.sed的删除操作

     4.1 通过行号进行删除

    4.2 匹配字符串内容删除

    4.3 字符串搭配正则进行删除

     5.sed命令替换

    5.1 字符串的替换 

     5.1.1 匹配单字符进行替换

    5.1.2   进行字母字符进行大小的替换

    5.1.3  知识扩充  “//”是可以被其他符号所替换的 

    5.2 整行替换 

    5.3 单字符的替换 

     6.sed命令的增加

     6.1 sed 命令行插入

    6.2 sed命令行后读取文件插入 

     7.sed 命令进行复制粘贴

    8. sed命令中字符串和字符的位置交换

     总结


     1.sed的相关知识及其工作流程

     1.1 sed编辑器的介绍

     

     sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

     

    1.2 sed 流编辑器的工作过程

    sed的工作流程主要包括读取、执行和显示三个过程:

    • 读取 sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
    • 执行 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
    • 显示 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完。

    在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

    注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中。

    1.3 经典技术题

    怎么解决sed命令处理容量过大,或则内容过多的而导致执行效率慢的问题?

     解决方案一(推荐用法):

    使用split命令进行文件分割(例如文件如果是百万行,就创建一个单独的目录将文件分割为一百个为一万行的文本)再使用sed命令进行处理,除了split分割,也可以使用一个遍历分割shell脚本进行执行

     

     解决方案二:

    使用cat  文件名|sed  处理     (但是该方案只能针对中大型的文件文本,如果文本量过大,处理效果不好)

    2. sed命令格式 与选项操作符

     2.1 sed命令格式

     

    基本操作格式: 

    • sed -e '操作'  文件1   文件2  
    • sed -n -e '操作'   文件1   文件2
    • sed -f   脚本文件   文件1  文件2
    • sed -i -e '操作'  文件1  文件2

    执行多条命令的格式:

    方式一: 

     sed -n -e '操作1' -e '操作2' 文件  ​

    方式二: 

     sed -n -e '操作1;操作2' 文件  ​  

    方式三: 

    sed -e 'n{  

    操作1  

    操作2  

    ......  

    }' 文件1

     2.2 sed命令的常用选项

     

    选型作用
    -e 或--expression=表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
    -f 或--file=表示用指定的脚本文件来处理输入的文本文件
    -h 或--help显示帮助
    -n、--quiet或--silent禁止sed编辑器输出,但可以与p命令一起使用完成输出
    -i直接修改目标文本文件

    2.3 sed命令的操作符 

     

    操作符作用
    s替换,替换指定字符
    d删除,删除选定的行
    a增加,在当前行下方增加一行指定内容
    i插入,在选定行上方插入一行指定内容
    c替换,将选定行替换为指定内容
    y字符转换,转换前后的字符长度必须相同
    p打印行内容。如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用
    =打印行号
    l (小写L)打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

                                        sed最为核心的功能是增删改查

     3.sed命令的打印功能

     3.1 默认打印方式

    3.1.1 无要求的默认打印 

    1. [root@localhost sed]#sed -e 'p' english.txt
    2. [root@localhost sed]#sed -n 'p' english.txt

     

    3.1.2 打印时对行号的操作 

     

    1. [root@localhost sed]#sed -n '=' english.txt
    2. [root@localhost sed]#sed -n '=;p' english.txt

     

     

     

     

    3.2 sed命令的寻址打印

     

     

    3.2.1 以数字形式打印行区间

     

    方式一:按照行号寻求内容

     

    1. [root@localhost sed]#sed -n '1p' english.txt
    2. [root@localhost sed]#sed -n '4p' english.txt
    3. [root@localhost sed]#sed -n '$p' english.txt

     

    方式二:进行行号范围区间的打印

    1. [root@localhost sed]#sed -n '1,3p' english.txt
    2. [root@localhost sed]#sed -n '5,$p' english.txt
    3. [root@localhost sed]#sed -n '5,+2p' english.txt
    4. [root@localhost sed]#sed -e '5q' english.txt

     

     

     方式三:指定间隔打印

     

    1. [root@localhost sed]#sed -n -e '5p' -e'$p' english.txt
    2. [root@localhost sed]#sed -n -e '2p' -e'3p' english.txt

     

     方式四:对奇数行和偶数行的打印

     

    1. [root@localhost sed]#sed -n 'n;p' english.txt
    2. [root@localhost sed]#sed -n 'p;n' english.txt

     

     

     3.2.2 文本模式过滤行内容

     

     方式一:对包含的字符串进行过滤打印

     

    1. [root@localhost sed]#sed -n '/o/p' english.txt
    2. [root@localhost sed]#sed -n '/th/p' english.txt

     

     

     方式二:应用基础正则表达式进行打印

    1. [root@localhost sed]#sed -n '/^root/p' /etc/passwd
    2. [root@localhost sed]#sed -n '/bash$/p' /etc/passwd
    3. [root@localhost sed]#sed -n '4,/bash$/p' /etc/passwd

     

     

     方式三:使用扩展正则表达式进行打印

     

    注意: 

     sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 。

     

    1. [root@localhost sed]#sed -r -n '/(99:){2,}/p' /etc/passwd
    2. [root@localhost sed]#sed -r -n '/^root|bash$/p' /etc/passwd

     

     

     4.sed的删除操作

    注意: 

    以下的操作均为在默认情况下操作,有测试的效果,sed  -i   时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作) 

     

     4.1 通过行号进行删除

    1. [root@localhost sed]#sed -n '3d;p' english.txt
    2. [root@localhost sed]#sed -n '5,8d;p' english.txt
    3. [root@localhost sed]#sed -n '5,$d;p' english.txt

     

     

    [root@localhost sed]#sed   '4,6!d'   english.txt 
    

     

     

     

    4.2 匹配字符串内容删除

    1. [root@localhost sed]#sed '/one/d' english.txt
    2. [root@localhost sed]#sed '/one/,/six/d' english.txt

     

    1. [root@localhost sed]#sed '/one/,/six/!d' english.txt
    2. [root@localhost sed]#sed '/six/!d' english.txt

     

     

    4.3 字符串搭配正则进行删除

     

    [root@localhost sed]#sed   '/^$/d'   english.txt 
    

     

     

     

     

    删除空行的三种方法:

    1. grep -v "^$" file.txt //过滤出非空行
    2. cat file.txt |tr -s "\n" //压缩换行符
    3. sed '/^$/d' file.txt //删除空行

     

     5.sed命令替换

    格式:

     行范围 s/旧字符串/新字符串/替换标记  ​

     

     替换标记:

     数字:表明新字符串将替换第几处匹配的地方  

    g:表面新字符串将会替换所有匹配的地方

     p:打印与替换命令匹配的行,与-n一起使用

     w 文件:将替换的结果写入文件中 

     

     sed命令的替换中:

    s:替换字符串

    c:整行替换

    y:字符替换,替换前后的字符串长度必须相同

     

    5.1 字符串的替换 

     

     5.1.1 匹配单字符进行替换

    1. [root@localhost sed]#sed -n 's/root/test/2p' /etc/passwd
    2. [root@localhost sed]#sed -n 's/root/test/gp' /etc/passwd

     

     

    [root@localhost sed]# sed -n '/^root/ s/^/#/p'   /etc/passwd
    

     

    5.1.2   进行字母字符进行大小的替换

     

    大写转换为小写 :

    [root@localhost sed]#sed -i 's/[A-Z]/\l&/g'  english.txt 

     

    小写转换为大写:

    1. [root@localhost sed]#sed -i 's/[a-z]/\u&/' english.txt
    2. [root@localhost sed]#sed -i 's/[a-z]/\U&/' english.txt

     

     

    [root@localhost sed]#sed -i 's/[a-z]/\U&/g'  english.txt 

     

     

    5.1.3  知识扩充  “//”是可以被其他符号所替换的 

    经典分隔符转换案例:

     

     

    5.2 整行替换 

     

     使用c进行替换,是对整行内容进行替换。

     

    1. [root@localhost sed]# sed '/ONE/c 22' english.txt
    2. [root@localhost sed]# sed '/TWO/c TEST' english.txt

     

     

    5.3 单字符的替换 

     

    使用y,是对单个字符进行替换,每个字符需要一一对应,不是整体替换。前后字符串长度需要一致,不然会报错。 

    [root@localhost sed]# sed 'y/TH/12/' english.txt 
    

     

     

     

     6.sed命令的增加

    a:在行后添加内容

    i:在行前插入内容

    r:在行后读入文件内容

     

     6.1 sed 命令行插入

    1. [root@localhost sed]# sed '/THREE/a 123 ' english.txt
    2. [root@localhost sed]# sed '/THREE/i 123 ' english.txt

     

    6.2 sed命令行后读取文件插入 

    [root@localhost sed]#sed  '$r english2.txt'  english.txt
    

     

     

     

     7.sed 命令进行复制粘贴

    H复制、d删除、G粘贴到指定行下方

    1. [root@localhost sed]#sed '1,3 {H;G};$G' english.txt
    2. [root@localhost sed]#sed '1,3 {H;d};$G' english.txt

     

     

     

    8. sed命令中字符串和字符的位置交换

     

    1. [root@localhost sed]#echo 123abc|sed -r 's/(123)(abc)/\2\1/'
    2. [root@localhost sed]#echo 123abc|sed -r 's/(.)(.)(.)(.)(.)(.)/\6\5\4\3\2\1/'

     

     

     

     

     总结

     1.sed命令是一种流编辑器读取文件会进行逐行读取加上指令操作,所以过大的文件一定要拆分后再交给sed处理

    2.sed  -r  搭配扩展正则表达式使用,使用\{n\}    \{n,\}     \{n,m\}    不需要加“\”

     3. 用 -i 时一定要先备份(尤其对重要文件的操作),或者时先实验好确定无误时,再使用 -i

    4.sed  命令 的重点在于增删改查四个功能,可以运用在脚本中对重要文件配置的修改,添加等作用尤其有效 

     

     

     

  • 相关阅读:
    雪花算法及微服务集群唯一ID解决方案
    arm麒麟安装mysql
    [附源码]java毕业设计个人信息管理系统
    JavaSE进阶21天---第二十天---JavaSE(​​日志、logback日志、添加模板、类加载器、ressources文件夹)
    [2022/6/29]考试总结
    244:vue+openlayers 显示滚动效果的线段Line
    ch4-2 音频信号的时域特征
    mybatis的SQL打印说明
    SpringBoot2.X与redis Lettuce集成踩坑
    NPM 设置淘宝cnpm 镜像
  • 原文地址:https://blog.csdn.net/qq_62462797/article/details/126728926