sed命令

sed命令

  sed, 即Stream Editor,是linux系统中一种行编辑器

 

用法

 

  sed [OPTION]... {script-only-if-no-other-script} [input-file]...

 

常用选项

-n                                           不输出模式空间内容到屏幕,即不自动打印

-e                                         多点编辑

-f /PATH/SCRIPT_FILE     从指定文件中读取编辑脚本

-r                                          支持使用扩展正则表达式

-i                                           直接在源文件上修改,且不备份

-i.bak                                   对源文件进行备份,文件名FILE.bak,然后在源文件上编辑

 

script

script中的内容可以分为两大类,地址定界和命令。

地址定界,即对需要匹配的行划定范围,可以通过指定具体的行数,比如5,或者2到9行;也可以通过正则表达式来确定。

命令,即对通过地址匹配到的行进行的操作,包括打印、删除等。

 

地址定界

  • 不给地址:对全文进行处理
  • 单地址:

#: 指定的行

/pattern/:被此处模式所能够匹配到的每一行

  • 地址范围:

#,#

#,+#

/pat1/,/pat2/

#,/pat1/

  • ~:步进

1~2 奇数行

2~2 偶数行

 

编辑命令

d                        删除模式空间匹配的行

p                        显示模式空间中的内容

a [\]text             在指定行后面追加文本

支持使用\n实现多行追加

i[\]text               在行前面插入文本

c [\]text             替换行为单行或多行文本

w /path/file     保存模式匹配的行至指定文件

r /path/file        读取指定文件的文本至模式空间中

匹配到的行后

=                        为模式空间中的行打印行号

!                          模式空间中匹配行取反处理

 

搜索查找操作

s///                     查找替换,支持使用其它分隔符,s@@@,s###

替换标记:

g:         行内全局替换

p:         显示替换成功的行

w /PATH/FILE:将替换成功的行保存至文件中

测试1——查看(可以完成grep命令能做的大部分任务)

  创建一个文件test文件,往里写入1, 2, ...

  •  
    [root@vathe-pc tmp]#seq 1 14 > test           # 创建test文件
    [root@vathe-pc tmp]#head -6 test           # 查看前6行
    1
    2
    3
    4
    5
    6 

  单地址

  • 查看该test文件
  • [root@vathe-pc tmp]#sed '' test    #  中间单引号不能省略,表示不做处理
    1
    2
    3
    4
    5

  sed 命令默认会把每行内容都打印一篇,故而执行上面的命令,会打印全文;使用-n 选项就不会打印,可以尝试如下命令

  • [root@vathe-pc tmp]#sed -n '' test
    [root@vathe-pc tmp]#
  • 查看第3行
  • [root@vathe-pc tmp]#sed -n '3p' test    # p命令,表示打印print
    3
    [root@vathe-pc tmp]#sed '3!d' test     # d命令,表示删除delete
    3

     

上面两条命令均可查看特定行,区别在于:

第一条默认不打印,搜索到第3行,然后打印

第二条命令,默认会打印每一行,“3!”表示不是第三行,“d”命令表示删除,则“3!d”表示不是第三行,就删除——不打印。

 

  • 查看出现’root’字符串的行
  • [root@vathe-pc tmp]#cp /etc/passwd ./     # 复制文件
    [root@vathe-pc tmp]#sed -n '/root/p' passwd
    root:x:0:0:root:/root:/bin/bash
  • 下面为passwd文件的前14行 
  • [root@vathe-pc tmp]#cat -n passwd         # 查看 passwd 文件
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
         8  halt:x:7:0:halt:/sbin:/sbin/halt
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
        11  operator:x:11:0:operator:/root:/sbin/nologin
        12  games:x:12:100:games:/usr/games:/sbin/nologin
        13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
        14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
           ...

  范围地址查看

  • 查看5至8行
  • [root@vathe-pc tmp]#sed -n '5,8p' test
    5
    6
    7
    8

     

  • 打印第3行,至出现‘halt’字符的行
  • [root@vathe-pc tmp]#sed -n '3,/halt/p' passwd
    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

测试2——修改

  行后添加。搜索含有”halt”字符的行,在每行后添加’github.com’

[root@vathe-pc tmp]#sed  '/halt/a\github.com' 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       # 搜索到的行
github.com                             # 添加的字符
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

  行前添加。搜索含有”adm”字符的行,在每其每行前添加’github.com’

 

  

[root@vathe-pc tmp]#sed  '/adm/i\github.com' 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
github.com
adm:x:3:4:adm:/var/adm:/sbin/nologin
...

  代替行内容。搜索含有‘2’字符的行,将其替换为‘100’

[root@vathe-pc tmp]#sed '/2/c\100' test
1
100        # 原来为2
3
4
5
6
7
8
9
10
11
100        # 原来为12
13
14

测试3——查询替换

  • 查询‘adm’字符串,查找到之后,将其替换为’admin’字符串
  • [root@vathe-pc tmp]#grep 'adm' passwd
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    [root@vathe-pc tmp]#sed -n 's/adm/admin/p' passwd
    admin:x:3:4:adm:/var/adm:/sbin/nologin      # 仅替换第一个adm
    [root@vathe-pc tmp]#sed -n 's/adm/admin/gp' passwd
    admin:x:3:4:admin:/var/admin:/sbin/nologin  # 都替换了
    [root@vathe-pc tmp]#

    // 后一条命令g选项表示,匹配到的行,行中所有的“adm”都替换为“admin”

  • 在单词‘halt’后添加‘ing’字符串
  • [root@vathe-pc tmp]#grep halt passwd
    halt:x:7:0:halt:/sbin:/sbin/halt
    [root@vathe-pc tmp]#sed -n 's/adm/admin/gp' passwd
    admin:x:3:4:admin:/var/admin:/sbin/nologin

高级编辑命令

h:  把模式空间中的内容覆盖至保持空间中

H:  把模式空间中的内容追加至保持空间中

g:  从保持空间取出数据覆盖至模式空间

G:  从保持空间取出内容追加至模式空间

x:   把模式空间中的内容与保持空间中的内容进行互换

n:    读取匹配到的行的下一行覆盖至模式空间

N:  读取匹配到的行的下一行追加至模式空间

d:    删除模式空间中的行

D:  删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed 

高级用法示例

sed 'n;d' FILE                      # 查看奇数行

sed -n 'n;p' FILE                # 查看偶数行

sed '1!G;h;$!d' FILE          # 逆向查看文件,类似于tac FILE

sed '$!N;$!D' FILE             # 查看倒数两行

sed '$!d' FILE                      # 查看最后一行

sed ‘G’ FILE                         # 在每行后追加一空行

 

posted @ 2017-04-28 20:32  Vathe  阅读(274)  评论(0编辑  收藏  举报