shell之流编辑器sed技术

概述

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

命令格式

1
2
3
4
5
6
7
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
# 注意:
# sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
# 只有当命令存在语法错误时,sed的退出状态才是非0
sed -ri bak
sed -ric --follow-symlinks

对正则表达式的支持

  • 与grep一样,sed在文件中查找模式时,也可以使用正则表达式RE和各种元字符。

  • 正则表达式是括在斜杠间的模式,用于查找和替换 ,以下是sed支持的元字符:

    • 使用基本元字符集:^ ,$, .,*,[],[^],\ <\ >,\ (\ ),{ \ }。

    • 使用扩展元字符集:?,+,{ },|,( )。

    • 使用扩展元字符的方式:\ +,sed -r。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      [root@centos7 shell]# cat passwd
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/root:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed 'd' passwd # 读一行到模式空间就删除

      [root@centos7 shell]# sed '4,7d' passwd # 删除文件4-7行, 没有真正修改文件
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/root:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -i '4,7d' passwd # 删除文件4-7行,真正修改文件
      [root@centos7 shell]# cat passwd
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/root:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      # sed -ri,-i表示真改文件,-r表示支持扩展元字符
      [root@centos7 shell]# sed -r 'p' passwd # p表示打印,读一行打印一行
      root:x:0:0:root:/root:/bin/bash
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/root:/sbin/nologin
      operator:x:11:0:operator:/root:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r -n 'p' passwd # -n表示静默的方式,单纯的执行p,所以n和p基本一起用
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/root:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r -n '/root/p' passwd # 打印只有root的行
      root:x:0:0:root:/root:/bin/bash
      operator:x:11:0:operator:/root:/sbin/nologin

      [root@centos7 shell]# sed -r -n '/root/=' passwd # 打印只有root的行的行号
      1
      6

      [root@centos7 shell]# sed -r 's/root/alice/' passwd # s表示search查找,查找所有行,将root换成alice,非贪婪
      alice:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/alice:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r 's/root/alice/g' passwd # g表示全局,即一行所有root换成alice,贪婪
      alice:x:0:0:alice:/alice:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/alice:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r 's/Root/alice/gi' passwd # i表示忽略大小写
      alice:x:0:0:alice:/alice:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/alice:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r '/root/d' passwd # 在模式空间删除带有root的行,或者写成sed -r '\#root#d'
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r 's/\/sbin\/nologin/\/var\/mylogin/' passwd # /sbin/nologin换成/var/mylogin
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/var/mylogin
      daemon:x:2:2:daemon:/sbin:/var/mylogin
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/var/mylogin
      operator:x:11:0:operator:/root:/var/mylogin
      games:x:12:100:games:/usr/games:/var/mylogin
      ftp:x:14:50:FTP User:/var/ftp:/var/mylogin
      nobody:x:99:99:Nobody:/:/var/mylogin
      systemd-network:x:192:192:systemd Network Management:/:/var/mylogin
      dbus:x:81:81:System message bus:/:/var/mylogin
      polkitd:x:999:998:User for polkitd:/:/var/mylogin

      [root@centos7 shell]# sed -r '/^bin/,5d' passwd # 从以bin开头的行删到第5行,即最多删5行
      root:x:0:0:root:/root:/bin/bash
      operator:x:11:0:operator:/root:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r '/^bin/,+5d' passwd # 从以bin开始的行,再连删5行,一共删6行
      root:x:0:0:root:/root:/bin/bash
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r '/root/!d' passwd # 除了带有root的行都删除
      root:x:0:0:root:/root:/bin/bash
      operator:x:11:0:operator:/root:/sbin/nologin

      [root@centos7 shell]# sed -r '1~2d' passwd # 从第一行开始,每间隔2行删除,即:删除所有奇数行
      bin:x:1:1:bin:/bin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      operator:x:11:0:operator:/root:/sbin/nologin
      ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
      polkitd:x:999:998:User for polkitd:/:/sbin/nologin

      [root@centos7 shell]# sed -r '0~2d' passwd # 删除所有偶数行
      root:x:0:0:root:/root:/bin/bash
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      games:x:12:100:games:/usr/games:/sbin/nologin
      nobody:x:99:99:Nobody:/:/sbin/nologin
      dbus:x:81:81:System message bus:/:/sbin/nologin

sed命令

  • sed命令告诉sed对指定行进行何种操作,包括打印,删除,修改等。

    命令 功能
    a 在当前行后添加一行或多行
    c 用新文本修改(替换)当前行中的文本
    d 删除行
    i 在当前行之前插入文本
    l 列出非打印字符
    p 打印行
    n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
    q 结束或退出sed
    对所选行以外的所有行应用命令
    s 用一个字符串替换另一个(s替换标志,g在行内进行全局替换,i忽略大小写)
    r 从文件中读
    w 将行写入文件
    y 将字符转换为另一字符(不支持正则表达式)
    h 把模式空间里的内容复制到暂存空间(覆盖)
    H 把模式空间里的内容追加到暂存空间
    g 取出暂存空间的内容,将其复制到模式空间,覆盖该处原有内容
    G 取出暂存空间的内容,其复制到模式空间,追加在原有内容后面
    x x交换暂存缓冲区与模式空间的内容
    -e 允许多项编辑
    -f 指定sed脚本文件名
    -n 取消默认的输出
    -i inplace,就地编辑
    -r 支持扩展元字符
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    [root@centos7 shell]# cat passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '3{h;d}' passwd # 将第3行复制到暂存空间,然后在模式空间删除
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '1,5s/(.*)/#\1/' passwd # 将1-5行最前面加上#,第一种方式
    #root:x:0:0:root:/root:/bin/bash
    #bin:x:1:1:bin:/bin:/sbin/nologin
    #daemon:x:2:2:daemon:/sbin:/sbin/nologin
    #halt:x:7:0:halt:/sbin:/sbin/halt
    #mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '1,5s/.*/#&/' passwd # 将1-5行最前面加上#,第二种方式
    #root:x:0:0:root:/root:/bin/bash
    #bin:x:1:1:bin:/bin:/sbin/nologin
    #daemon:x:2:2:daemon:/sbin:/sbin/nologin
    #halt:x:7:0:halt:/sbin:/sbin/halt
    #mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '1,5s/^/#/' passwd # 将1-5行最前面加上#,第三种方式
    #root:x:0:0:root:/root:/bin/bash
    #bin:x:1:1:bin:/bin:/sbin/nologin
    #daemon:x:2:2:daemon:/sbin:/sbin/nologin
    #halt:x:7:0:halt:/sbin:/sbin/halt
    #mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r 's/(.)(.)(.*)/\1YYY\2\3/' passwd # 将每行的第2和第3个字符间插入YYY
    rYYYoot:x:0:0:root:/root:/bin/bash
    bYYYin:x:1:1:bin:/bin:/sbin/nologin
    dYYYaemon:x:2:2:daemon:/sbin:/sbin/nologin
    hYYYalt:x:7:0:halt:/sbin:/sbin/halt
    mYYYail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    oYYYperator:x:11:0:operator:/root:/sbin/nologin
    gYYYames:x:12:100:games:/usr/games:/sbin/nologin
    fYYYtp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nYYYobody:x:99:99:Nobody:/:/sbin/nologin
    sYYYystemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dYYYbus:x:81:81:System message bus:/:/sbin/nologin
    pYYYolkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r 's/(.*)(.)/\1YYY\2/' passwd # 在每行的最后一个字符前插入YYY
    root:x:0:0:root:/root:/bin/basYYYh
    bin:x:1:1:bin:/bin:/sbin/nologiYYYn
    daemon:x:2:2:daemon:/sbin:/sbin/nologiYYYn
    halt:x:7:0:halt:/sbin:/sbin/halYYYt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologiYYYn
    operator:x:11:0:operator:/root:/sbin/nologiYYYn
    games:x:12:100:games:/usr/games:/sbin/nologiYYYn
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologiYYYn
    nobody:x:99:99:Nobody:/:/sbin/nologiYYYn
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologiYYYn
    dbus:x:81:81:System message bus:/:/sbin/nologiYYYn
    polkitd:x:999:998:User for polkitd:/:/sbin/nologiYYYn

    [root@centos7 shell]# sed -r '/mail/r /etc/hosts' passwd # 将/etc/hosts中的内容添加到passwd文件中有mail的行的后面
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '2r/etc/hosts' passwd # 将/etc/hosts中的内容添加到passwd文件中第2行的后面
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '/root/w test.txt' passwd # 将passwd文件中有root的行保存到test.txt文件中
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    [root@centos7 shell]# cat test.txt
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

    [root@centos7 shell]# sed -r '/root/awwwwwwwww' passwd # 处理到root的行,在下一行追加一个wwwwwwwww
    root:x:0:0:root:/root:/bin/bash
    wwwwwwwww
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    wwwwwwwww
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '2a111111111' passwd # 在第2行的下一行追加111111111
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    111111111
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '/root/iwwwwwwwww' passwd # 处理到root的行,在上一行追加一个wwwwwwwww
    wwwwwwwww
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    wwwwwwwww
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '/root/cwwwwwwwww' passwd # 用wwwwwwwww替换有root的行
    wwwwwwwww
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    wwwwwwwww
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '/halt/{n;d}' passwd # 将有halt那一行的下一行删除
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    [root@centos7 shell]# sed -r '/adm/{n;n;d}' passwd # 将有halt那一行的下下行删除
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

sed暂存空间和模式空间的转换

  • 转换机制如下图:

    image-20210815161857836
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    # 默认情况下,暂存空间里面是个换行符(空行)
    [root@centos7 shell]# cat passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    [root@centos7 shell]# sed -r 'g' passwd # 处理第一行时,从暂存空间拿过来一个换行符,拿来覆盖,第二行类推












    [root@centos7 shell]# sed -r 'G' passwd # 处理第一行时,从暂存空间拿过来一个换行符,拿来追加,这行下面会增加一个空行,第二行以此类推
    root:x:0:0:root:/root:/bin/bash

    bin:x:1:1:bin:/bin:/sbin/nologin

    daemon:x:2:2:daemon:/sbin:/sbin/nologin

    halt:x:7:0:halt:/sbin:/sbin/halt

    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    operator:x:11:0:operator:/root:/sbin/nologin

    games:x:12:100:games:/usr/games:/sbin/nologin

    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    nobody:x:99:99:Nobody:/:/sbin/nologin

    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

    dbus:x:81:81:System message bus:/:/sbin/nologin

    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    [root@centos7 shell]# cat hosts
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

    [root@centos7 shell]# sed -r '1h;$G' hosts # 把hosts的第1行覆盖写到暂存空间(模式空间只有1行,暂存空间只有1行),然后把暂存空间的内容追加到hosts的最后1行(相当于把hosts的第1行复制到最后一行)
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

    [root@centos7 shell]# sed -r '1{h;d};$G' hosts # 把第1行覆盖写到暂存空间,并删除hosts的第1行,然后把暂存空间的内容追加到最后一行(相当于把hosts的第1行复制到最后一行,并删除第1行)
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

    [root@centos7 shell]# sed -r '1h;2,$g' hosts # 把第1行放到暂存空间,然后将暂存空间的内容放到第2行至最后一行
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    [root@centos7 shell]# sed -r '1h;2,$g' passwd
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    [root@centos7 shell]# sed -r '1h;2,$G' passwd # 把第1行放到暂存空间,然后将暂存空间的内容添加到第2行至最后一行的后面
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    halt:x:7:0:halt:/sbin:/sbin/halt
    root:x:0:0:root:/root:/bin/bash
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    games:x:12:100:games:/usr/games:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    nobody:x:99:99:Nobody:/:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    dbus:x:81:81:System message bus:/:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash

    [root@centos7 shell]# sed -r '2!d' hosts # 除了第2行外都删除
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

编辑文件实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sed '/^#/d' file.txt # 删除配置文件中#开头的行

sed '/[ \t]*#/d' file.txt # 若#号前面有空格或者tab,也能删除

sed '\Y[ \t]*//Yd' file.txt # \Y和Y是一对,表示正则,\表示申明一下,删除配置文件中//号注释行

sed -r '/^$/d' file.txt # 删除无内容空行

sed -r '/^[ \t]*$/d' file.txt # 删除无内容空行

sed '/[ \t]*#/d;/[ \t]*$/d' file.txt # 删除注释行和空行

sed -ri '$achroot_local=Yes' file.txt # 在最后一行追加chroot_local=Yes

sed -ri '/^SELINUX=/cSELINUX=disable' file.txt # 将SELINUX=开头的行换成SELINUX=disable

sed -r '2,6s/^/$/' file.txt # 给文件添加注释

sed -r '2,6s/(.*)/#\1/' file.txt # 给文件添加注释

sed -r '2,6s/.*/#&/' file.txt # 给文件添加注释,&表示匹配前面的内容

sed -r '2,6s/^#*/#/' file.txt # 将行首的0-多个#换成一个#

sed -r '2,6s/^[ \t]*#*/#/' file.txt # 将0-多个#换成一个#,包括:前面有空格或者tab的情况

sed使用外部变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@centos7 shell]# var1=1111
[root@centos7 shell]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@centos7 shell]# sed -ri "2a$var1" hosts # 在第2行后追加一个var1变量,即1111(不加引号也行)
[root@centos7 shell]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
1111
[root@centos7 shell]# sed -ri '$a'"$var1" hosts # 在最后一行追加一个var1变量,即1111,或者写成sed -ri "\$a$var1"
[root@centos7 shell]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
1111
1111