文本三剑客之sed用法总结

描述:

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

用法:
  sed [option]… ‘script' inputfile…

     常用选项:

    -n :不输出模式空间内容的自动打印

示例:仅列出/etc/passwd 文件内的第5-7行

[root@localhost ~]# nl /etc/passwd |sed -n '5,7p'
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    -e:  多点编辑

示例:处理/etc/fstab 或/etc/fstab/,使用sed命令取出其基名

[root@localhost ~]# echo "/etc/fstab" |sed -r -e 's@/$@@' -e 's@/.*/@@'
fstab
[root@localhost ~]# echo "/etc/fstab/" |sed -r -e 's@/$@@' -e 's@/.*/@@'
fstab

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

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

示例:处理/etc/fstab 路径,使用sed命令取出其目录名

[root@localhost ~]# echo "/etc/fstab/" |sed -r 's@[^/]+/?$@@'
/etc/

    -i:  原处编辑 (危险操作,不建议使用)

     script:地址命令

   (1) 不给地址:对全文进行处理

   (2) 单地址:

        #:  指定的行

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

   (3) 地址范围:

        #,#

        #,+#

      /pat1/,/pat2/

       #,/pat1/

   (4) ~ :步进

       1~2  奇数行

       2~2  偶数行


     编辑命令:

   d:  删除模式空间匹配的行

示例:将/etc/passwd 的内容列出并打印行号,同时删除第2-5行

[root@localhost ~]# nl /etc/passwd |sed '2,5d'
     1root:x:0:0:root:/root:/bin/bash
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

   p:  显示模式空间中的内容

示例:将第2行打印到屏幕上

[root@localhost ~]# nl /etc/passwd |sed '2p'
     1root:x:0:0:root:/root:/bin/bash
     2bin:x:1:1:bin:/bin:/sbin/nologin
     2bin:x:1:1:bin:/bin:/sbin/nologin
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin

   a \text :在行后面追加文本;支持使用\n 实现多行追加

示例:在第2行后加上“drink tea”字样

[root@localhost ~]# nl /etc/passwd |sed '2a drink tea'
     1root:x:0:0:root:/root:/bin/bash
     2bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin

   i \text :在行前面插入文本;支持使用\n 实现多行插入

示例:在第2行前加上“drink tea”字样

[root@localhost ~]# nl /etc/passwd |sed '2i drink tea'
     1root:x:0:0:root:/root:/bin/bash
drink tea
     2bin:x:1:1:bin:/bin:/sbin/nologin

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

示例:将第2-5行的内容替换成为“NO 2-5 number”

[root@localhost ~]# nl /etc/passwd |sed '2,5c NO 2-5 number'
     1root:x:0:0:root:/root:/bin/bash
NO 2-5 number
     6sync:x:5:0:sync:/sbin:/bin/sync

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

示例:将第5-7行保存到/root/f1文件中

[root@localhost ~]# nl /etc/passwd |sed '5,7w/root/f1'
[root@localhost ~]# cat f1
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

   r /path/from/somefile :读取指定文件的文本至模式空间中匹配到的行后

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

[root@localhost ~]# sed -n '/^$/=' /etc/issue     显示空白行的行号
3

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

[root@localhost ~]# sed -n '/^$/!=' /etc/issue     除空白行以外的行显示行号
1
2

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

示例:删除/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符

[root@localhost ~]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg 
#
# DO NOT EDIT THIS FILE
if [ -s $prefix/grubenv ]; then
load_env
fi

     v:  替换标记:

     g:  行内全局替换

     p:  显示替换成功的行

[root@localhost ~]# sed -e's@^#@@p' /etc/fstab   显示替换成功的行
 /etc/fstab
 /etc/fstab
 Created by anaconda on Sun Aug  7 06:26:08 2016
 Created by anaconda on Sun Aug  7 06:26

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

[root@localhost ~]# sed 's@^#@@w/root/f3' /etc/fstab    将替换成功的行保存至/root/f3文件中
[root@localhost ~]# cat f3
 /etc/fstab
 Created by anaconda on Sun Aug  7 06:26:08 2016
 Accessible filesystems, by reference, are maintained under '/dev/disk'
 See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info


       高级编辑命令:

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

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

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

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

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

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

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

   d:  删除模式空间中的行

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

事先准备好的文件:

[root@localhost ~]# cat f1
1
2
3
4
5
6
7
8
9
10

1,sed  -n  'n;p' FILE

[root@localhost ~]# sed -n 'n;p' f1      显示偶数行
2
4
6
8
10

2,sed   '1!G;h;$!d'  FILE

[root@localhost ~]# sed '1!G;h;$!d' f1     逆序显示
10
9
8
7
6
5
4
3
2
1

3,sed  '$!N;$!D" f1

[root@localhost ~]# sed '$!N;$!D' f1     只显示最后两行
9
10

4,sed   '$!d'  FILE

[root@localhost ~]# sed '$!d' f1     只显示最后一行
10

5,sed   ‘G’ FILE

[root@localhost ~]# sed 'G' f1     在每一行的后面添加一个空白行
1

2

3

4

5

6

7

8

9

10

6,sed   ‘g’ FILE

[root@localhost ~]# sed 'g' f1     显示10个空白行

7,sed   ‘/^$/d;G’ FILE

[root@localhost ~]# sed '/^$/d;G' f1      显示的效果和第5题一样,但不同之处是:
1                              先将文件内的所有空白行删除,然后在每一行的后面添加一个空白行
2
3

8,sed   'n;d' FILE

[root@localhost ~]# sed 'n;d' f1        显示基数行
1
3
5
7
9

9,sed   -n '1!G;h;$p'  FILE

[root@localhost ~]# sed -n '1!G;h;$P' f1      显示最后一行
10


总结:

1,sed工具作为文本处理三剑客中的一员,体现了其强大的功能,在处理多文件和写脚本中的应用是很个广泛的,需多加练习,才能灵活掌握其用法

2,以行为单位的新增/删除功能,替换/显示功能,‘s/要被替换的字符串/新的字符串/g'功能是经常用到的,需记忆并多加练习才能熟练掌握




原创文章,作者:pingsky,如若转载,请注明出处:http://www.178linux.com/32121