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

相关推荐

  • centos7 root密码忘记怎么修改

           对于事务繁忙或者容易忘东忘西的朋友说,想要记着一些事情总感觉比登天还要难,特别是像密码之类的。可能要记忆的密码太多,总是不经意间就把密码忘记或者把密码混淆。总之这种站的比例还是有点分量的,例如我刚刚接触Linux时 ,第一把centos7装到电脑上没有多久,就把root密码忘记了,费了好时间,也请教了很多…

    Linux干货 2017-04-03
  • CentOS系统启动流程、selinux、Systemd剖析

    交互式登录配置文件读取顺序: /etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc 非交互式登录配置文件读取顺序: ~/.bashrc –> /etc/bas…

    Linux干货 2018-03-04
  • 马哥教育网络班第21期+第五周课程作业

    1、 显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@redhat6 ~]# grep '^[[:space:]]\+' /boot/grub/grub.conf   2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的…

    Linux干货 2016-08-08
  • Linux 文本查看及处理工具&&用户和组管理

    1、列出当前系统上所有已登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 ~]# who | cut -d ' ' -f 1 | sort -u 2、取出最后登入到当前系统的相关信息。 ~]# last&…

    Linux干货 2016-10-05
  • 马哥教育网络21期+第六周练习博客

    马哥教育网络21期+第六周练习博客 请详细总结vim编辑器的使用并完成以下练习题     VIM编辑器:         vi:Visual Interface 文本编辑器    &nbsp…

    Linux干货 2016-08-05
  • HAProxy基于Keepalived做高可用并简单实现Web站点的动静分离

    HAProxy简介   HAProxy 是一个免费的,非常快速和可靠的解决方案,提供 高可用性, 负载均衡和代理对TCP和HTTP的应用程序。它特别适用于非常大流量网站。多年来,它已成为标准开源的负载均衡,现在随最主流的Linux发行版,并且通常默认的云平台部署。 实验描述 1、本实验主要是在前端放置两台通过Keepalived做了高可用的HAProxy反向…

    Linux干货 2016-04-16