首页 > 代码库 > sed命令详解

sed命令详解

sed命令详解

sedStream  EDitor 流编辑器,行编辑器

sed [OPTION]...  `script` [input-file]...

script:地址定界编辑命令

1.常用选项:

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

(静止默认行为,默认输出所有,最终输包括两点:默认的和‘’定义的)

  -e script--expression=script:多点编辑

  -f  /PATH/TO/SED_SCRIPT_FILE

     每行一个编辑命令

  -r, --regexp-extened:支持使用扩展正则表达式

  -i[SUFFIX],--in-place[=SUFFIX]:直接编辑原文件(并保存在原文件中)

 

2.地址定界:

  1)空地址:对全文进行处理

  2)单地址:

             #:指定行

             /pattern/:被模式所匹配到的每一行

  3)地址范围:

          ##:起始行道结束行

          #+#:比如3+8表示从第三行开始加8行结束,包含第三行,共九行

          #/pat1/:从指定行开始到匹配到的第一个模式所在行结束

             /pat1/,/pat2/,/pat3/... 第二、第三个模式...结束

  4)步进:~

           1~2:表示1,3,5,7,9....行(奇数行)

           2~22,4,6...行(偶数行)

3.编辑命令:

          1d:删除 eg~]# sed ‘1,5d’file  表示删除file的前5行,输出剩下行。

                       ~]# sed ‘/^UUID/d’ file 删除UUID开头的所有行

                       ~]#sed ‘/^#/d’file  删除#开头的所有行

                       ~]#sed  -n ‘1,5d’ file 理解:先匹配到除删除的5行输出,这输出被-n所禁                           

                                               止,所以最终输出的是空白。

                     ~]#sed ‘3d’ file  删除第三行

                     ~]#sed’1~2d’ file 删除奇数行,输出偶数行

       2pprint当前模式:默认情况输出一遍,p命令再输一遍。

               eg~]# cat  test

                    1

                    2

                    3

                    4

                    5

                    6

                   ~]# sed ‘1~2p‘ ./test

                    1

                    1

                    2           

                    3

                    3

                    4

                    5

                    5

                    6

          3a  \textappend):在行后面追加文本“text”,支持使用\n实现多行追加

          4)  i  \textinsert):在行前面追加文本“text”,支持使用\n实现多行追加

            eg:在第三行前插入    ~]# sed ‘3i \new line‘ ./test

                               1

                                    2

                                    new line

                                    3

                                    4

            eg:在第三行后添加    ~]# sed ‘3a \new line‘ ./test

                                    1

                                    2

                                    3

                                    new line

                                    4

            eg:支持实现多行追加  

                            ~]# sed ‘3a \new line \nanother  new line‘ ./test

                              1

                              2

                              3

                              new line

                              another  new line

                              4

           eg:在指定的没一行后添加一个内容,此中在UUID行后添加一个#的注释信息

               t ~]# sed ‘/^UUID/a\# add new device base on UUID‘ ./test

               UUID=5ef6bf9b-eaa0-4523-ad82-97b0f3af8097 /                                   

               # add new device base on UUID

               UUID=5ef6bf9b-eaa0-4523-ad82-97b0f3af8097 /                                  

               # add new device base on UUID

               UUID=4679cd8d-a956-4114-8f65-0ec38397d35b /boot                          

               # add new device base on UUID

    

          5c  \textchange):将匹配到的行替换为此处指定的文本“text

            eg:将上述UUID的行用text内容替换掉

                ~]# sed ‘/^UUID/c\# add new device base on UUID‘ ./test

                  # add new device base on UUID

                  # add new device base on UUID

                  # add new device base on UUID

                  # add new device base on UUID

                  # add new device base on UUID

        

         6w  \PATH\TO\SOMEFILE:将模式空间中匹配到的行保存到指定的文件  中    

      eg:此中将/etc/fstab中非#开头的行保存至/tmp/fstab.new

          ~]# sed  -n  ‘/^[^#]/w  /tmp/fstab.new‘ /etc/fstab

          ~]# cat  /tmp/fstab.new

             UUID=5ef6bf9b-eaa0-4523-ad82-97b0f3af8097 /                      

             UUID=4679cd8d-a956-4114-8f65-0ec38397d35b /boot               

             UUID=efbf4f17-d0bd-4e8b-b740-2bc56aba720c swap

        

       7r  /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件中;合并文件   

       eg: 表示将/etc/issue中的内容写入(插入)到/etc/fstab内容的第三行位置

           (文件合并的一种方法)

           ~]# sed  ‘3r  /etc/issue‘   /etc/fstab

  

       8=:为模式匹配到的行加行号

        eg:  ~]# sed  ‘/^UUID/=‘  /etc/fstab

              9

              UUID=5ef6bf9b-eaa0-4523-ad82-97b0f3af8097 /                      

              10

              UUID=4679cd8d-a956-4114-8f65-0ec38397d35b /boot                 

              11

              UUID=efbf4f17-d0bd-4e8b-b740-2bc56aba720c swap  

 

       9! :条件取反

         eg~]# sed  ‘/^#/!d‘  /etc/fstab

         不加!表示将非#开头行留下,加!取反将#开头行留下

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

             替换标记:

                g:全局替换

                w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中

                p:显示替换成功的行

 

练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符。

sed  ‘s@^[[:space:]]\+@@‘  /etc/grub2.cfg

  @...@@:被替换部分   @@:替换部分,此中将空白部分替换成无,什么都没有。

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

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

练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;

替换messages

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

/var/log/

替换messages,当其后有/时,加\?,表示查找可有可无这种情况

     ~]# echo  "/var/log/messages" | sed ‘s@[^/]\+/\?$@@‘

/var/log/

 

sed命令详解