• Shell脚本文本三剑客之Sed


    目录

    一、sed编辑器

    1.1Sed概述

    1.2Sed工作流程

    1.3Sed基本用法

    1.4Sed常用选项

    1.5sed命令的常用操作

    二sed命令的使用

    查找打印内容

    打印x行后退出

     打印指定行,行区间

     打印奇数偶数行

    通过正则来打印

    增(a、i、c)

    大小写转换

      两个文件合并


    一、sed编辑器

    1.1Sed概述

    • sed编辑器时一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流

    1.2Sed工作流程

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

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

    模式空间:简单理解就是一个缓冲区,sed从输入流中一行一行的取出内容放到这个缓冲区中按照SCRIPT(脚本)进行处理。

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

    1.3Sed基本用法

    命令格式

    sed  -e  '操作'  文件1  文件2  ...

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

    sed  -f  简本文件  文件1  文件2  ...

    sed  -i  -e  '操作'  文件1  文件2  ...

    sed  -e  'n{操作1  操作2  ...}'文件1  文件2 ...

    1.4Sed常用选项

    -e表示用指定命令来处理输入的文本文件,只有一个操作命令时可以省略,一般执行多个操作命令的时候会使用
    -f表示用指定的脚本文件来处理输入的文本文件
    -h显示帮助
    -n禁止sed编辑器输出,即不自动打印,与p命令一起使用,又恢复自动打印,完成输出
    -i备份文件文件并原处编辑
    -r使用扩展正则表达式

    1.5sed命令的常用操作

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

    二sed命令的使用

    查找打印内容

    1. //先读取第一行,放入缓冲区,再按照命令处理,p打印
    2. [root@localhost data]# sed -e 'p' users.txt
    3. 1,zhangsan
    4. 1,zhangsan
    5. 2,lisi
    6. 2,lisi
    7. 3,wangwu
    8. 3,wangwu
    9. 4,zhaoliu
    10. 4,zhaoliu
    11. 5,qianqi
    12. 5,qianqi
    13. 6,zhuba
    14. 6,zhuba
    15. //只有一个操作时,-e可加可不加,不加-n打印两遍
    16. [root@localhost data]# sed 'p' users.txt
    17. 1,zhangsan
    18. 1,zhangsan
    19. 2,lisi
    20. 2,lisi
    21. 3,wangwu
    22. 3,wangwu
    23. 4,zhaoliu
    24. 4,zhaoliu
    25. 5,qianqi
    26. 5,qianqi
    27. 6,zhuba
    28. 6,zhuba
    29. #查找第二行内容,不加-n,否则会全部输出
    30. [root@localhost data]# sed -n '2p' passwd
    31. bin:x:1:1:bin:/bin:/sbin/nologin
    32. #查找第13行内容
    33. [root@localhost data]# sed -n '1,3p' passwd
    34. root:x:0:0:root:/root:/bin/bash
    35. bin:x:1:1:bin:/bin:/sbin/nologin
    36. daemon:x:2:2:daemon:/sbin:/sbin/nologin
    37. #查看第一行和他后面的三行内容
    38. [root@localhost data]# sed -n '1,+3p' passwd
    39. root:x:0:0:root:/root:/bin/bash
    40. bin:x:1:1:bin:/bin:/sbin/nologin
    41. daemon:x:2:2:daemon:/sbin:/sbin/nologin
    42. adm:x:3:4:adm:/var/adm:/sbin/nologin
    43. #查找第38行到最后一行的内容
    44. [root@localhost data]# sed -n '38,$p' passwd
    45. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    46. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    47. tcpdump:x:72:72::/:/sbin/nologin
    48. zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
    49. apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    50. [root@localhost data]#
    51. #显示1-5
    52. [root@localhost data]# sed -e '5q' passwd
    53. root:x:0:0:root:/root:/bin/bash
    54. bin:x:1:1:bin:/bin:/sbin/nologin
    55. daemon:x:2:2:daemon:/sbin:/sbin/nologin
    56. adm:x:3:4:adm:/var/adm:/sbin/nologin
    57. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    58. #打印行号,不打印内容
    59. [root@localhost data]# sed -n '=' users.txt
    60. 1
    61. 2
    62. 3
    63. 4
    64. 5
    65. 6
    66. #显示非打印字符
    67. [root@localhost data]# sed -n 'l' users.txt
    68. 1,zhangsan$
    69. 2,lisi$
    70. 3,wangwu$
    71. 4,zhaoliu$
    72. 5,qianqi$
    73. 6,zhuba$
    74. #同时处理多条操作
    75. [root@localhost data]# sed -n -e '=' -e 'p' users.txt
    76. 1
    77. 1,zhangsan
    78. 2
    79. 2,lisi
    80. 3
    81. 3,wangwu
    82. 4
    83. 4,zhaoliu
    84. 5
    85. 5,qianqi
    86. 6
    87. 6,zhuba
    88. [root@localhost data]# sed -n -e '=;p' users.txt
    89. 1
    90. 1,zhangsan
    91. 2
    92. 2,lisi
    93. 3
    94. 3,wangwu
    95. 4
    96. 4,zhaoliu
    97. 5
    98. 5,qianqi
    99. 6
    100. 6,zhuba
    101. [root@localhost data]# sed -n '
    102. > =
    103. > p
    104. > ' users.txt
    105. 1
    106. 1,zhangsan
    107. 2
    108. 2,lisi
    109. 3
    110. 3,wangwu
    111. 4
    112. 4,zhaoliu
    113. 5
    114. 5,qianqi
    115. 6
    116. 6,zhuba
    117. #查找含有root的行
    118. [root@localhost data]# sed -n '/root/p' passwd
    119. root:x:0:0:root:/root:/bin/bash
    120. operator:x:11:0:operator:/root:/sbin/nologin
    121. [root@localhost data]#
    122. #查找包含bash或者root的行
    123. [root@localhost data]# sed -nr '/bash|root/p' passwd
    124. root:x:0:0:root:/root:/bin/bash
    125. operator:x:11:0:operator:/root:/sbin/nologin
    126. zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
    127. #查找数字出现三次的行,使用扩展正则需要加上-r参数
    128. [root@localhost data]# sed -n '/[0-9]{3}/p' passwd
    129. [root@localhost data]# sed -nr '/[0-9]{3}/p' passwd
    130. games:x:12:100:games:/usr/games:/sbin/nologin
    131. systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    132. polkitd:x:999:997:User for polkitd:/:/sbin/nologin
    133. abrt:x:173:173::/etc/abrt:/sbin/nologin

    实现一次性执行多条命令

        在'   '中使用;   即' ;  '

        -e  ' A '   -e  ' B '文件

    -e '

      A

      B

    ' 文件

    打印x行后退出

     sed  'xq'  文件

     打印指定行,行区间

    打印一行内容

    sed  -n  'xp'  文件   (x代表行号)

    打印行号区间

    sed  -n  '1,4'  testfile.sh 

    sed  -n  '1,+3p'  testfile.sh    显示第一行之后连续三行内容,,,效果等同于1,4

     打印奇数偶数行

    n的作用移动到下一行

     

    通过正则来打印

     r

    增(a、i、c)

    sed '指定行范围a 指定内容' 文件名

            在指定第二行下增加内容

    sed '指定行范围i 指定内容' 文件名

            在指定第二行上增加内容

     sed '指定行范围c 指定内容' 文件名

    替换第三行内容

     指定第3到4行替换为指定行内容(多行变为一行)

     指定包含e的行替换为指定行内容

    删除所有行

    sed 'd'   文件

    删除指定行

    sed '1d'  文件

    删除指定的多行

    sed '2,8d'  文件

    删除以s开头

    sed  '/^s/d'  文件

    删除以en结尾

    sed  '/en$/d'  文件

    删除除了en结尾的行

    sed  '/en$/!'  文件

    删除空行

    sed  '/^$/d'  文件

    sed  -n  '/^$/!p'  文件

    删除包含2的行删除到第一个包含3的行,,,这里/2/看作一个字符串(如果后面还有2开头的会继续重复执行,,如果没有3开头会一直删到结尾)

    sed  '/2/,/3/d'  文件

    与正则表达式一起使用

    删除结尾为bash或nologin的行

    sed -r '/bash$|nologin$/d' /etc/passwd

    从包含第1个字符串的行开始删除,到包含第2个字符串的位置停止删除

    如果找不到第2个字符串的行,则删到最后一行

    sed '/one/,/six/d' file1

    删除1-3的行

    格式

    sed [选项] '行范围 s/旧字符串/新字符串/替换标记' 文件名

    4种替换标记: .

    • 数字:表明新字符串将替换第几处匹配的地方
    • g:表明新字符串将会替换所有匹配的地方
    • p:打印与替换命令匹配的行,与-n- 起使用
    • 文件:将替换的结果写到文件中
       

    //两个并一起代表空格

    ,,,删除空格 

     开头的空格用#代替

     加 -i才能对文件进行修改

     sed  -i '/swap/ s/^/#/' /etc/swap

    不加范围,替换每行查找到的字符串

    sed -n 's/root/admin/p' /etc/passwd

    (swapoff  -a  关闭swap  临时关闭   /etc/rc.d/rc.local   里面添加swapoff  -a   添加权限+x    /etc/fstab永久关闭)

    1. //root替换为admin,不加g和数字,默认替换每行第一个匹配到的root
    2. [root@localhost data]# sed -n 's/root/admin/p' passwd
    3. admin:x:0:0:root:/root:/bin/bash
    4. operator:x:11:0:operator:/admin:/sbin/nologin
    5. //加数字2,替换每行匹配到的第二个root
    6. [root@localhost data]# sed -n 's/root/admin/2p' passwd
    7. root:x:0:0:admin:/root:/bin/bash
    8. //加g则是全部替换
    9. [root@localhost data]# sed -n 's/root/admin/gp' passwd
    10. //删除前面的所有0
    11. [root@localhost data]# echo 000000001010|sed 's/^0*//'
    12. 1010
    13. //1-3行加上注释
    14. [root@localhost data]# sed '1,10 s/^/#/' passwd
    15. #root:x:0:0:root:/root:/bin/bash
    16. #bin:x:1:1:bin:/bin:/sbin/nologin
    17. #daemon:x:2:2:daemon:/sbin:/sbin/nologin
    18. //将所有root开头的行注释
    19. [root@localhost data]# sed -n 's/^root/#root/p' passwd
    20. #root:x:0:0:root:/root:/bin/bash
    21. [root@localhost data]# sed -n '/^root/ s/^/#/p' passwd
    22. #root:x:0:0:root:/root:/bin/bash
    23. //注释fstab文件中的swap行
    24. [root@localhost data]# sed -n '/swap/ s/^/#/p' /etc/fstab
    25. #/dev/mapper/centos-swap swap swap defaults 0 0
    26. [root@localhost data]# sed -n 's/.*swap.*/#&/p' /etc/fstab
    27. #/dev/mapper/centos-swap swap swap defaults 0 0
    28. [root@localhost data]#
    29. sed '1,4{H;d};$G' t2 //H复制 d删除(即为剪切) G粘贴, $最后一行

    大小写转换

    sed中,使用\u表示大写,\l表示小写

    1. 把每个单词的第一个小写字母变大写:

    sed 's/\b[a-z]/\u&/g' filename

    2. 把所有小写变大写:

    sed 's/[a-z]/\u&/g' filename

    3. 大写变小写:

    sed 's/[A-Z]/\l&/g' filename

    修改之后再保存 

     

     替换的符号

      两个文件合并

     两个文件合并

    vim编辑器末行模式中  r加上要合并的文件

    或者下图

    或者cat命令

    或者paste命令

     

     互换位置

  • 相关阅读:
    unity 改变模型及其子物体的Shader和透明度
    刷题记录(NC19246 数据结构)
    安防监控系统/视频云存储/监控平台EasyCVR服务器解释器出现变更该如何修改?
    解决分布式锁bug,shiro-01
    git学习笔记
    【CF1693C】Keshi in Search of AmShZ(类dijkstra)
    通过反射获取Class对象的四种方式
    解决mybatis-plus不能俩表联查分页之手动写分页
    Redis内存模型讲解
    upgrade k8s (by quqi99)
  • 原文地址:https://blog.csdn.net/A_Xiao_CaiJI/article/details/126698220