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

相关推荐

  • 文件共享服务之NFS

    文件共享服务之NFS 文件共享服务之NFS 一、什么是NFS及NFS的工作流程 二、NFS发展及问题 三、NFS简单部署 一、什么是NFS及NFS的工作流程 NFS(Network File System,网络文件系统)  NFS是借助于RPC来实现功能的 RPC:(Remote  Procedure  Call  p…

    Linux干货 2016-04-19
  • corosync v2 + pacemaker + crmsh 实现mariadb高可用

    高可用mariadb拓扑图 一、设计前提     1、时间同步 # ntpdate 172.16.0.1 或者 # chronyc sources     2、所有的主机对应的IP地址解析可以正常工作, 主机名要与命令#uname -n 所得的结果一致   &…

    Linux干货 2016-08-28
  • 基于iptables mangle的lvs && lvs的持久连接

    一、lvs-dr类型:也称direct routing,简称为g(gatewaying);配置lvs-dr基于iptables mangle的实现方式  实验图:  地址规划:    VIP: 172.16.2.100    DIP: 172.16.2.13    RIP1:17…

    Linux干货 2015-06-30
  • 第二次作业

    一、只显示某目录下隐藏文件    答案1:#ls -d /tmp/*/    但是此答案是我在同学知道下完成,但是原理没明白 如果单独执行        #ls -d  &nbsp…

    Linux干货 2016-08-03
  • 第九周作业

    第九周作业

    Linux干货 2017-11-13
  • Ubuntu 葵花宝典入门篇——要练此功,可能得自宫?

        此文章给初入ubuntu的小伙伴们写一篇装机篇和使用心得。第二期会给小伙伴介绍软件安装篇。如题目所说,乌班图确实是葵花宝典,练好了天下无敌。只是如果要安装UBUNTU系统,只是在虚拟机上跑跑是不够的,你必须在实际的桌面环境和服务器环境上才能体会到它的运行方式,而桌面环境和服务器环境几乎差不多。所以安装桌面版可以更好的理解…

    Linux干货 2017-03-26