文本处理三剑客之Sed(行编辑器)

sed(流编辑器,行编辑器)

    是一种流编辑器,一次处理一行内容,处理时把当前处理的行存储在临时缓存中,成为“模式空间”,接着用sed命令处理缓冲区的内容,处理完毕后吧缓冲区内容输出到屏幕接着处理下一行。这样不断重复到末尾。文件内容并没有改变。除非使用重定向输出才会改变内容。

sed:行编辑器(全屏编辑器:vi)

    \\把制定行提取到内存中编辑,编辑完成后,显示在屏幕上。

        sed:模式空间

##默认不编辑源文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕。

用法:

    sed [option]… 'script' inputfile…

    常用选项

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

        -e: 多点编辑

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

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

         -i: 原处编辑

     script:

         '地址命令'

        

     地址定界

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

         (2) 单地址:

            #: 指定的行

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

         (3) 地址范围:

             #,#

             #,+#

             /pat1/,/pat2/

             #,/pat1/

         (4) ~:步进

         1~2 奇数行

         2~2 偶数行

编辑命令

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

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

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

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

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

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

          r /path/from/somefile:读取指定文件的文本至模式空

            # sed -i.bak '/^U/r /etc/issue' f3

           //-i.bak表示把f3这个文件备份,然后在把/etc/issue这个文件读入f3间中匹配到的行后

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

            # sed '/^UUID/p' /testdir/f3

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

   v        # sed '/^UUID/!d' /testdir/f3 == # sed -n '/UUID/p' /testdir/f3

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

          替换标记:

          g: 行内全局替换

          p: 显示替换成功的行

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

             例子// sed ‘2p’ /etc/passwd

             sed –n ‘2p’ /etc/passwd

             sed –n ‘1,4p’ /etc/passwd

             sed –n ‘/root/p’ /etc/passwd

             sed –n ‘2,/root/p’ /etc/passwd 从2行开始

             sed -n ‘/^$/=’ file 显示空行行号

             sed –n –e ‘/^$/p’ –e ‘/^$/=’ file

             sed ‘/root/a\superman’ /etc/passwd行后

             sed ‘/root/i\superman’ /etc/passwd 行前

             sed ‘/root/c\superman’ /etc/passwd 代替行


高级编辑命令

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

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

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

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

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

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

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

    d: 删除模式空间中的行

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

         sed -n 'n;p' FILE

                    sed ‘/^$/d’ file

         sed ‘1,10d’ file

         nl /etc/passwd | sed ‘2,5d’

         nl /etc/passwd | sed ‘2a tea’

         sed 's/test/mytest/g' example

         sed –n‘s/root/&superman/p’ /etc/passwd 单词后

         sed –n‘s/root/superman&/p’ /etc/passwd 单词前

         sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets

         sed –i.bak ‘s/dog/cat/g’ pets

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

         sed '$!N;$!D' FILE

         sed '$!d' FILE

         sed ‘G’ FILE

         sed ‘g’ FILE

         sed ‘/^$/d;G’ FILE

         sed 'n;d' FILE

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

语法

   # sed [options] 'AddressCommand' file …

   "options:

         -n:不显示模式空间中的行

         -i:直接修改源文件 

         -e SCRIPT -e SCRIPT:可以同时执行多个脚本

         -f /PATH/TO/SED_SCRIPT:

         # sed -f /path/to/sed_script

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

        

    "Address

         1、StartLine,EndLine

         比如1,100行

         $:最后一行

         2、/RegExp/

         /^root/

         3、/pattern1/,/pattern2/

         \\第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行。

         4、LineNumber

         \\指定的行,精确某行。

         5、StartLine,+N

         \\从startLine开始,向后的N行;。

        

    "Command

         d:删除符合条件的行

         # sed '1,2d' /etc/fstab

         p:显示符合条件的行

         a \string:在指定的行后面追加新行,内容为string

         \\'\n':可以换行。

         i \string:在指定的行前面追加新行,内容为string

         r FILE:将指定范围内的内容添加至符合条件的行处

         w FILE:将指定范围内的内容另存至指定的文件中

         s/pattern/string/修饰符:查找并替换,默认至替换每行中第一次被模式匹配到的字符串

         加修饰符

         g:全局替换

         i:忽略字符大小写

         s///:s@@@,s%%%,s###

         &:引用模式匹配整个串

         # sed 's#l..e#&r#g' sed.txt \\表示在匹配到的字符串中加入指定内容。

         # sed 's#\(l..e\)#\1r#g' sed.txt \\同上。

        

sed练习:

    1、删除/etc/grub.conf文件中行首的空白符;

           # sed 's#^[[:space:]]##g' /etc/grub.conf

    2、删除/etc/inittab文件中的空白行;

          # sed '/^$/d' /etc/inittab

    3、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5;

         # sed 's@\(id:\)[0-9](\:initdefault:\)@\15@\2g' /etc/inittab

    4、删除/etc/inittab文件中开头的#号;

         # sed 's@^#@@g' /etc/inittab

    5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;

         # sed -r 's@^#[[:space:]]+@@g' /etc/inittab

    6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#;

         # sed -r 's@^[[:space:]]+#@@g' /etc/inittab

    7、取一个文件路径的目录名称

         # echo "/etc/rc.d" | sed -r  's@^(/.*/)[^/]+/?@\1@g'

    保留文件的基明

         # echo "/etc/rc.d" | sed -r 's@^/.*/([^/]+)/?@\1@g'


原创文章,作者:皱 多利亚,如若转载,请注明出处:http://www.178linux.com/34290

(0)
皱 多利亚皱 多利亚
上一篇 2016-08-15 09:26
下一篇 2016-08-15 09:26

相关推荐

  • 作业管理

    作业管理 ·Linux的作业控制:          前台作业:通过终端启动,且启动后一直占据终端;          后台作业:可通过终端启动,但启动后即转入后台运行(释放终端) ·如何让作业运行于…

    Linux干货 2016-09-11
  • 基于NFS服务的mariadb数据库实现

    实验要求:     (1) nfs server导出/data/目录;     (2) nfs client挂载/data/至本地的/mydata目录;本地的mysqld或mariadb服务的数据目录设置为/mydata, 要求服务能正常启动,且可正常 存储数据;   (3)用另一台主机,…

    2017-06-11
  • 主流Linux发行版对比

      对服务器来说,没有最好的Linux发行版。一切都取决于企业的实际需求。 如今Linux已不再只是一款自由操作系统,它还承载了许多企业的核心应用。在对比流行的Linux发行版时,不仅要考虑有吸引力的功能集,还要关注系统的支持与服务。 服务器管理员担心操作系统的维护和支持周期。维护生命周期指的是Linux发行版持续提供产品补丁和更新的时间。支持方面…

    Linux干货 2016-10-31
  • # Linux运维入门初步—–第二周

    标签(空格分隔): Linux入门 linux 运维 — 写作:N27_李伟 2017-7-13一、 Linux上常用的文件管理命令都有哪些,使用方法1. 文件类型的分类文件类型:– 普通文件类型d:目录文件b:块设备c:字符设备l:符号链接文件p:管道文件,pipes:套接字文件,socket例如: [root@loong ~]# …

    Linux干货 2017-07-19
  • Linux用户管理相关

    Q1列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@radio_freshman ~]# who root     tty1         201…

    Linux干货 2016-11-13