码迷,mamicode.com
首页 > 系统相关 > 详细

Linux基础之sed流编辑器详解

时间:2016-08-10 14:37:12      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:sed

之前介绍了三大文本编辑器的grep,这里介绍比grep功能更强的sed流编辑器


sed是什么?


sed是Stream EDitor的缩写,man中对sed的简洁为

sed - stream editor for filtering and transforming text

它的主要功能是对文本的过滤与替换。


sed的工作原理


sed的工作过程:sed是一个流编辑器,所谓流编辑器是指sed每次只从文件或stdin中读入一行,将读入的行保存至模式空间然后根据指定的要求对其进行处理,并将处理后的结果输出至屏幕,接着读入下一行,整个文本的过程如流水线般被逐行处理后输出。


sed对内容的处理方式:sed不是在原文件中或原输入上直接进行处理的,它将读入的行放入缓存区,对缓存区里的内容进行处理,处理完毕后默认不会写入或覆盖源文件,而是直接输出到屏幕上。


它有两个内存缓冲区分别叫做:模式空间(pattern space)、保持空间也有称作暂存缓存区(holding space)。


一般情况下sed首先把第一行装入模式空间,进行处理后输出屏幕,然后第二行装入模式空间替换掉模式空间里原来的内容,再进行处理,依次循环,直至结束。


下面是我对sed工作流程的理解图。

技术分享

1、sed每次将stdin中的内容中的一行读入模式空间

2、之后sed根据模式空间中的匹配条件进行匹配,符合条件进入下一阶段即普通编辑,不满足则默认至标准输出,结束

3、普通编辑之后分两阶段,1)普通编辑之后选择性显示至STDOUT,结束;2)进入holding space进行高级编辑,编辑结束后选择性显示至STDOUT,结束。


sed语法


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

{script-only-if-no-other-script}:可以理解为地址定界编辑命令。

常用选项

         -n:不输出模式空间中的内容至屏幕

            suppress automatic printing of pattern space

         -e:多点编辑

            add the script to the commands to be executed

         -f:每行一个编辑命令

            add the contents of script-file to the commands to be executed

         -r:使用扩展表达式

            use extended regular expressions in the script.

         -i:直接编辑原文件

         edit files in place (makes backup if SUFFIX supplied)


地址定界

        1、空地址:对全文处理

        2、单地址:

          #:指定行;

          /pattern/:被此模式所匹配到的每一行;

        3、地址范围:

         #,#:从#开始到#结束的所有行

         #,+#:从#开始向下至+#的行之间的所有行

         #,/pat1/ 从#开始至匹配到第一次出现/pat1/模式的行之间的所有行

         /pat1/,/pat2/:第一次匹配到/pat1/的行到第一次匹配到/pat2/的行之间的所有行

        4、步进:~

        1~2:所有奇数行          2~2:所有偶数行


编辑命令:编辑命令必须配合地址定界一起使用,若少了编辑命令会报错。

        d:删除模式空间中匹配到的内容               Delete pattern space

        a \text 在行后面插入文本“text”,支持使用\n实现多行插入

        Append text, which has each embedded newline  preceded  by  a  back slash.

       i \text 在行前面插入文本“text”,支持使用\n实现多行插入

       Insert  text,  which  has  each embedded newline preceded by a back slash.

       c \text 把匹配到的行替换为此处指定的文本“text”

       Replace the selected lines with text, which has each  embedded  new line preceded by a backslash.

       w filename 保存模式空间匹配的行至指定的文件中

              Write the current pattern space to filename.

       r filename 读取指定文件内容至当前文件被模式匹配到的行文件后合并

              Append text read from filename.

       =  : 为模式匹配到的行打印行号    Print the current line number.

       !: 条件取反

      s/regexp/replacement/ : 查找替换,其分隔符可自行指定,常用有s@@@,s###

                    p  :显示替换成功的行    

                    g  :全局替换

                    w  filename : 将替换成功的结果保存至指定文件中

       p  :显示当前模式空间中的内容    Print the current pattern space.


实例演示

1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符

sed ‘s#^[[:space:]]\+##‘ /etc/grub2.cfg

这里##是将前面匹配到的内容删除的意思,上面文本内容太多,就不截取了。

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#号及#后面的所有空白字符

sed ‘s@^#[[:space:]]\+@@‘ /etc/fstab
[root@localhost test]# cat /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Tue Jul 19 23:52:41 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=6efb8a23-bae1-427c-ab10-3caca95250b1 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost test]# sed ‘s@^#[[:space:]]\+@@‘ /etc/fstab
#
/etc/fstab
Created by anaconda on Tue Jul 19 23:52:41 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=6efb8a23-bae1-427c-ab10-3caca95250b1 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

3、在/etc/fstab每一行行首增加#号

cat /etc/fstab                           
#
# /etc/fstab
# Created by anaconda on Tue Jul 19 23:52:41 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=6efb8a23-bae1-427c-ab10-3caca95250b1 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
 sed ‘s@^@#&@‘ /etc/fstab
#
##
## /etc/fstab
## Created by anaconda on Tue Jul 19 23:52:41 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
##
#/dev/mapper/centos-root /                       xfs     defaults        0 0
#UUID=6efb8a23-bae1-427c-ab10-3caca95250b1 /boot                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

4、处理/etc/fstab路径,使用sed命令取出其目录名和基名

目录名

[root@localhost test]# echo ‘/etc/fstab‘ | sed -r ‘s#(.*/)([^/]+/?)#\1#‘ 
/etc/

基名

[root@localhost test]# echo ‘/etc/fstab‘ | sed -r ‘s#(.*/)([^/]+/?)#\2#‘
fstab


sed高级编辑命令:

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

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

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

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

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

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

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

    d:删除模式空间中的行;

    D:删除多行模式空间中的所有行;


高级编辑命令实例演示:

    sed  -n  ‘n;p‘  FILE:显示偶数行;

    sed  ‘1!G;h;$!d‘  FILE:逆序显示文件的内容;

    sed  ’$!d‘  FILE:取出最后一行;

    sed  ‘$!N;$!D‘ FILE:取出文件后两行;

    sed ‘/^$/d;G‘ FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;

    sed  ‘n;d‘  FILE:显示奇数行;

    sed ‘G‘ FILE:在原有的每行后方添加一个空白行;


本文出自 “张帆-IT的奇幻漂流” 博客,请务必保留此出处http://chawan.blog.51cto.com/9179874/1836438

Linux基础之sed流编辑器详解

标签:sed

原文地址:http://chawan.blog.51cto.com/9179874/1836438

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!