文本处理三剑客之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
下一篇 2016-08-15

相关推荐

  • haproxy

    12.1 高性能负载均衡软件HAProxy介绍 随着互联网业务的迅猛发展,大型电商平台和门户网站对系统的可用性和可靠性要求越来越高,高可用集群、负载均衡集群成为一种热门的系统架构解决方案。在众多的负载均衡集群解决方案中,有基于硬件的负载均衡设备,例如F5、Big-IP等,也有基于软件的负载均衡产品,例如HAProxy、LVS、Nginx等。在软件的负载均衡产…

    2018-01-03
  • 图解 lvs 工作原理

    一.lvs 基本工作流程介绍  如图1,ipvsadm定义lvs服务监听的ip和port,并发送给ipvs,而ipvs是工作在netfilter的input钩子上的程序,当input链中有目标ip属于lvs服务的请求报文时,ipvs就会修改该报文的链路,使其不进入用户空间而直接转到postrouting链上,并转发给其中一台real server,…

    Linux干货 2016-10-30
  • 7.28_Linux_ext数据结构inode的原理浅析、软硬链接的区别

    inode表结构浅析 下图以ext文件系统为参考,以4k块大小分区,简单描述一下ext文件系统的数据结构原理,如果有任何错误,烦请各位指出 inode 索引节点 硬盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。 扇区的大小,是2的N次方倍。分区的大小可以有多样,1k、2k、4k…以4k块大小来说明。4k块大…

    Linux干货 2016-08-03
  • Trie树:应用于统计和排序

    1. 什么是trie树 1.Trie树 (特例结构树)         Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少…

    Linux干货 2015-04-08
  • Linux-进程管理

    本小节介绍  1、进程的描述  2、用户怎么样管理进程  3、进程管理的命令 进程的概念        内核的功能:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等。        Pro…

    2017-07-02
  • 正则表达式常用元字符

    正则表达式的使用需要借助于工具程序来实现,我们使用grep来演示正则表达式元字符的使用。     grep使用方法             grep是一种文本搜索工具,根据用户指定的文本模式(搜索条件…

    Linux干货 2015-03-10