文本三剑客之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

(0)
pingskypingsky
上一篇 2016-08-10 13:58
下一篇 2016-08-10 13:58

相关推荐

  • Bash1

    做语法测试,没有消息就是最好的消息 加权限 单个语句的错误并不妨碍之后的语句,但是逻辑错误会导致后续语句执行不了 bash:     -n:语法测试     -x:模拟单步执行 变量类别:     本地变量   &nbs…

    Linux干货 2016-09-17
  • nginx AIO机制与sendfile机制

    nginx AIO机制与sendfile机制 从0.8.11版本开始, nginx 开始支持Linux native aio,如何在nginx里配置使用这套机制是本文介绍的重点。在下面的示例配置中,几个重要相关选项的具体含义如下: aio: Syntax: aio on | off | sendfi…

    Linux干货 2016-10-27
  • 源码安装http

    http://xxlii.blog.51cto.com/10277731/1841570     哈哈!

    Linux干货 2016-08-24
  • 三剑客之Sed

    sed:stream editor(流编辑器) 工作特性:并不直接处理文本文件本身,处理机制为每当处理一个文件的时候,它会逐行读取,每次把一行读取到内存空间中去,而后在模式空间(pattern space)中完成编辑.并把编辑好的结果输出到屏幕上  功      能:数据替换、删除、增加、等,数据为关键字或者一整行, …

    Linux干货 2016-08-08
  • vim编辑器

    在使用Linux的管理过程中有很多的工作就是要修改或设置某些重要软件的配置文件,这些配置文件都是以ASCLL的纯文本格式存在的,所以能够学好一个文本编辑器就至关重要了,vim作为高级版的vi编辑器不仅可以用不同的颜色来高亮显示某些重要关键字或字符还能进行如shell脚本的编写,c程序的编辑等功能。 vim编辑器和nano编辑器是一个全屏的编辑器。vim打开文…

    Linux干货 2016-12-20
  • 查找find命令简介

       之前都是写一些关于课后练习题的博客,既练习了课后习题也把博客写了,舒服!不过这周学的知识需要练习的不多,更多的是需要了解和记忆,所以给大家介绍一个自我觉得挺强大的一个命令,那就是查找find命令。大家都知道计算机的数据茫茫多,要想找到自己想要的级必须加点限制性的条件来缩小一下范围,或者准确的告诉计算机你想要的是什么。那么怎么来实现呢…

    2017-08-12