sed工作流程:

        sed称为流编辑器,它一次是处理一行的内容,处理时,把当前匹配到的行存储在临时缓冲区中,名为“模式空间”,接着sed命令就处理缓冲区中的内容,处理完后,就把内容输送到屏幕,然后接着处理下一行,直到文件的末尾。sed命令并不会修改原文件的内容,如果你使用sed -i 或者输出结果重定向。sed主要就是用来减少对文件的直接编辑,简化操作。

                文本编辑工具之sed用法简单命令和高级命令_编辑器

                sed先读取到第一行,然后保存在模式空间中,然后通过匹配给定的正则表达式来编辑读取到的行,存储在sed的另外一个模式空间中,叫保持空间。不能被表达式匹配的行就直接标准输出至屏幕。


sed命令:

         sed [option]..'script'[input-file]...

            script:地址定界编辑命令    比如:1~2d   //删除奇数行

            [option]:

              -n:不输出模式空间中的内容至屏幕

              -e:多点编辑                     

      [root@magedu ~]# sed -e '1~2d' -e '^#' /etc/fstab

       -f  /path/to/sed_script_file :每行一个编辑命令

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

              -i:直接编辑原文件

 

             地址定界:

                  1、不给地址,直接为空:表示对全文进行处理

                  2、单地址:   

                            #,指定行

                           /pattern/:对匹配到的每一行进行处理

                  3、地址范围:

                           #,#:表示第#行第#行        3 , 8 :  从第3行到第8行

                           #,+#:表示从第#行开始往下加#行,包括第#行     3,+8 : 从第三行往下加8行,总共9行

                           #,/pattern/:表示从#行到所匹配到的行

                           $:表示最后一行

                   4、步进:~

                        1~2:表示所有奇数行

                        2~2:表示所有偶数行

 

              编辑命令:

                         d:删除                   

           [root@magedu ~]# sed '1,5d' /etc/fstab  //删除1到5行
           [root@magedu ~]# sed '1~2d' /etc/fstab  //删除奇数行

                         p:显示模式空间中的内容                        

           [root@magedu ~]# sed '1~2p' /etc/fstab   //奇数行显示两遍

                         a \text:在行后面追加文本“text",支持使用\n实现多行追加;

                          i \text:在行前面加入文本“text”,支持使用\n实现多行插入;                                                

         [root@magedu ~]# sed '/^#/a \add new_line' /etc/fstab  //#开头的后一行加入add..          [root@magedu ~]# sed '/^#/i \add new_line' /etc/fstab  //#开头的前一行加入add..

              c \text:把匹配到的行替换为此处指定的文本“text”;                        

         [root@magedu ~]# sed '/^#/i \add new_line' /etc/fstab   //#开头的行替换成add..

            w /path/to/somefile:保存模式空间中匹配到的行到指定目录的文件中        

         [root@magedu ~]# sed '/^#/w /tmp/file.txt' /etc/fstab   //保存到/tmp目录下的file                                                                                   文件中

                      r /path/from/somefile:读取指定的文件的内容至当前文件模式所匹配到的行数                     

         [root@magedu ~]# sed  '3r /etc/issue' /etc/fstab
                                                 
          #
          # /etc/fstab                            //第三行后面加入/etc/issue的内容
          \S                    
          Kernel \r on an \m

          # Created by anaconda on Fri Mar 11 15:49:25 2016
          #
          # Accessible filesystems, by reference, are maintained under '/dev/disk'
          # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

           =:为模式匹配到的行在前一行打印出行号                    

          [root@magedu ~]# sed  '/^#/=' /etc/fstab

           2
           #
           3
           # /etc/fstab
           4
           # Created by anaconda on Fri Mar 11 15:49:25 2016

            !:条件取反    地址定界!编辑命令                       

           [root@magedu ~]# sed  '3!d' /etc/fstab
            # /etc/fstab

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

                              替换标记:

                                      g:全局替换

                                      w /path/to/somefile:将替换成功的结果保存至指定文件中;

                                      p:显示替换成功的行;

                比如:删除/etc/fstab文件中所有以#开头的#以及#后面接的一个或多个空白字符                          

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


            /etc/fstab
            Created by anaconda on Fri Mar 11 15:49:25 2016

            Accessible filesystems, by reference, are maintained under '/dev/disk'
            See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

            /dev/mapper/centos-root /                       xfs     defaults        0 0

                      输出一个路径,取出其路径名                      

          [root@magedu ~]# echo "/etc/passwd"  |sed 's@[^/]\+/\?$@@'
           /etc/

            用ifconfig命令,输出其IP地址:           

[root@magedu ~]# ifconfig |grep 'inet\>' |sed -e 's@inet@@' -e 's@net.*@@'|sed 's@127.*@@'
 172.18.254.97

              给定一文件,里面有6个网址,找出其域名并统计域名的个数

                                                               http://www.baidu.com/index.html

                                                               http://www.baidu.com/1.html

                                                               http://post.baidu.com/index.html

                                                               http://mp3.baidu.com/index.html

                                                               http://www.baidu.com/3.html

                                                               http://post.baidu.com/2.html           

[root@magedu ~]# cat 2.txt |sed -e 's@http://@@' -e 's@/.*@@' |sort -n |uniq -c
  1 mp3.baidu.com
  2 post.baidu.com
  3 www.baidu.com


高级编辑命令:

                  h:把模式空间中的内容覆盖至保持空间中

                  H:把模式空间中的内容追加至保持空间中

                  g:把保持空间中的内容覆盖至模式空间中

                  G:把保持空间中的内容追加至模式空间中

                  x:把模式空间中的内容和模式空间中的内容互换

                  n:读取匹配到的行的下一行覆盖至模式空间中

                  N:读取匹配到的行的下一行追加至模式空间中

                  d:删除模式空间中的行

                  D;删除多行模式空间中的所有行

       

   示例:

                sed -n 'n;p'  file:显示偶数行   不加-n的话偶数行显示两次                

[root@magedu tmp]# sed -n 'n;p' /etc/fstab
#
# Created by anaconda on Fri Mar 11 15:49:25 2016
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
UUID=a7eac9cf-1cdc-4919-8e5d-001170bbffdf /boot                   xfs     defaults        0 0
/dev/sdb1               /mydata                 ext4    defaults        0 0

      先分析下,sed先读取一行,然后执行n,把第二行的内容覆盖了存在模式空间中的第一行,然后显示模式空间中的内容,然后第一和第二行内容存入到保持空间中,然后sed又读取第三行,直到读取完文本。

                sed '1!G;h;$!d file:逆序输出

[root@magedu tmp]# sed '1!G;h;$!d' /etc/fstab
UUID=787d5a9a-b31f-4104-84ab-0a0a07fbeb72 /md0  ext4    defaults        0 0
/dev/sdb1               /mydata                 ext4    defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
UUID=a7eac9cf-1cdc-4919-8e5d-001170bbffdf /boot                   xfs     defaults        0 0
/dev/mapper/centos-root /                       xfs     defaults        0 0
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
# Created by anaconda on Fri Mar 11 15:49:25 2016
# /etc/fstab
#

             sed先读取第一行,因为是第一行,执行h,把第一行覆盖到保持空间中,不是末行就删除,就把模式空间的第一行删除了,读取第二行,不是第一行就执行G,把保持空间也就是第一行追加到了模式空间中,然后执行h,把第二行和第一行覆盖到保持空间中,不是末行就删除模式空间中的第二行和第一行,然后读取第三行,直到文件末尾。保持空间中排序就是n-1.......,3,2,1行,直到最后一行。

                sed '$!d' file:显示最后一行                

 [root@magedu tmp]# sed '$!d' /etc/fstab
 UUID=787d5a9a-b31f-4104-84ab-0a0a07fbeb72 /md0  ext4    defaults        0 0

                sed '$!N;$!D' file: 显示最后两行               

  [root@magedu tmp]# sed '$!N;$!D' /etc/fstab
  /dev/sdb1               /mydata                 ext4    defaults        0 0
  UUID=787d5a9a-b31f-4104-84ab-0a0a07fbeb72 /md0  ext4    defaults        0 0

                sed 'n;d' file : 显示奇数行

[root@magedu tmp]# sed  'n;d' /etc/fstab

# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
UUID=787d5a9a-b31f-4104-84ab-0a0a07fbeb72 /md0  ext4    defaults        0 0

                让每行都有空格:sed 'G' file           

[root@magedu tmp]# sed 'G' /etc/fstab


#

# /etc/fstab

# Created by anaconda on Fri Mar 11 15:49:25 2016

#