linux sed命令

sed简介

  sed是一个流(stream)编辑器,每次读取文本中的一行,放到内存的缓冲区(pattern space),然后使用sed命令处理pattern space中的内容,处理完成后,默认输出至屏幕(stdout)。随后处理下一行数据。

sed工作特性

  •   不直接编辑源文件,拷贝一份至pattern space,在内存中处理pattern space 中的内容。
  •   处理结果默认输出至stdout。

     

    注意:实际上sed还有一个holdspace,上图只是其基本的流程

 

sed 使用方法

  sed  [OPTION]  'script'  [input-file]……

    OPTION:

      -n:slient静默模式,一般情况下,来自标准输入(stdin)的数据,默认输出至屏幕(stdout)。但是加上-n后,则只有经过sed 特殊处理的内容才会被列出来。、

      -e script:多点编辑,对一行数据进行多个编辑命令。

      -f /PATH/TO/SED_SCRIPT_FILE:使用脚本处理数据。脚本中每一行为一个编辑命令。

      -r:支持扩展的正则表达式。

      -i[SUFFIX]:直接编辑原文件。

    script:script中内容是‘地址定界编辑命令’ (地址定界后直接跟编辑命令)。

      地址定界:空地址、单地址、范围地址、地址步进

        空地址:不给地址默认为全文处理。

        单地址:

          #:指定某一行。

          /pattern/:模式匹配行。

        范围地址:

          ns,nd:从ns行到nd行。

          ns,/pattern/:从ns行到pattern匹配到的行。

          ns,+#:从ns行开始偏移#行。

          /pattern1/,/pattern2/:从pat1到pat2匹配的行。

 

        地址步进:~

          1~2:从第一行开始,步进2,即所有奇数行。

      编辑命令:

        d:删除模式空间中的内容——删除后输出模式空间内容至默认输出

          

           使用-n选项后不会输出任何内容。因为被sed处理过的内容已经被删除,-n又不输出没有被处理过的内容。

          

        p:打印模式空间中的内容。通常 p 会与参数 sed -n 一起运行,只输出sed处理过的内容

            打印了两次3,4行的内容,第一次输出的“#  /etc/fstab”是默认输出,第二次输出的“#  /etc/fstab”,是sed读取文件内容到第三行是会被p命令

          (打印)处理。所以会有两行。

          

 

            使用-n,屏蔽了默认输出,至输出被sed处理过的内容。

          

         

        a \text:追加,在匹配行后追加一行新的数据为\text的行。可使用\n实现追加多行。

            第一行为空行,新加一行在第二行。

          

            使用\n实现多行插入。

          

        i  \text:插入,在匹配的行前插入一行新的数据为\text的行。可使用\n实现追加多行。

            第一行为空行,新加的一行在空行前插入。

          

            使用\n实现多行插入。

            

        c\text:把匹配到的行替换成为\test的内容。

            将开头为#的行替换成为null。

          

          

             使用-e参数来对同一数据进行多次处理。

          

        w /PATH/TO/SOMEFILE:保存模式空间中的内容至指定文件中

            首先删除以#开头的行然后将剩余内容输出至一个文件

               

         r /PATH/FROM/SOMEFILE:读取指定文件内容至当前文件被匹配到的行后,以实现文件合并。

            把/etc/issue 文件内容添加到 /etc/fstab 第一行后。

          

        =:在被匹配的行的前一行插入行号

            在第1-3行插入行号。

          

        !:条件取反,!要写在模式后边编辑命令前面——地址定界!编辑命令。

            删除所有非#开头的行。

          

        s///:查找替换,分隔符可自行指定,常用的有s@@@,s###等。

          替换标记:

            g:全局替换。

            w:将替换成功的结果保存至指定文件中。

            p:显示替换成功的行。

补充正则表达式元字符(引用于https://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2456968.html)

 

 

          练习一:删除/boot/grub/grub.conf 文件中以空格开头的空白字符

              sed ‘s@^[[:space]]\+@@’  /boot/grub/grub.conf

          练习二:删除/etc/fstab文件中所有以#开头的行首的#号及#号后的所有空白字符

              sed 's@^#[[:space]]*@@' /etc/fstab

          练习三:输出一个绝对路径给sed,取出其基目录。

              echo "/var/log/messages" |sed 's@[^/]\+$@@'

              echo "/var/log/messages/ |sed 's@ [^/]\+/?@@'

 

posted on 2018-06-05 19:16  HowOldAreYou  阅读(297)  评论(0编辑  收藏  举报

导航