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

相关推荐

  • Linux基础介绍

    1、Linux用户: Linux用户分为普通用户和管理员,普通用户的系统操作权限低,用户的误操作对系统数据的破坏程度有限,不会对系统造成灾难性的破坏。而管理员对系统具有绝对的权限,可以修改和设置系统的任何数据,如果误操作,及其容易对系统数据造成不可挽回的破坏,比如执行以下命令 rm  -rf  / 。因此,系统管理员在操作root用户时需…

    Linux干货 2016-07-26
  • 马哥教育网络20期+第8周练习博客

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥:链接层设备,基于MAC地址过滤。 集线器:物理层设备,基本都属于半双工模式。集线器与网桥在现在的局域网中基本都不用了。 二层交换机:基本MAC转发数据,功能齐全的可支持VLAN等功能。常见的有100/1000M、16口/24口/48口。 三层交换机:功能齐全的交换机,具备都…

    Linux干货 2016-08-01
  • N21—-第一周课程练习题

    1、描述计算机的组成及其功能。 我们现在通常理解为计算机是由硬件系统+软件系统组成的,根据冯·诺依曼体系结构。计算机主要由五大部件组成:      运算器(Datapath): 计算机中执行各种算术和逻辑运算操作的部件      控制器(Control):是整个计算机的中枢神经,…

    Linux干货 2016-07-12
  • Linux文件系统

    Linux:glibc 程序编译方式: 动态链接 静态编译 进程的类型: 终端:硬件设备,关联一个用户接口 与终端相关:通过终端启动 与终端无关:操作引导启动过程当中自动启动 操作系统的组成: 静态:kernel, application 文件系统:层级结构 FHS: Filesystem Hierarchy Standard /bin:所有用户可用的基本命…

    Linux干货 2016-11-10
  • 如何练好yum的一招一式

      工作时间越久,就越有这样一个深刻体会,一个新知识或者新的技能一个人学习起来并不会觉得吃力,反而要想把你学习的新知识或者新技能给讲清楚让普通人听得懂才是最难的,之前我写过一篇博客讲述linux下的RPM包管理器,今天写的练好yum的一招一式,同样都是都是在linux系统的软件包的安装、卸载、升级等功能的,为什么我们还需要yum那,记得一位大哲学家…

    Linux干货 2015-11-10
  • 第九周作业

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; 2、写一个脚本     (1) 获取当前主机的主机名,保存于hostname变量中;     (2) 判断此变量的值是否为loc…

    2017-04-20