sed是一种非交互式的文本编辑器。它能执行编辑任务,并且是非交互,非常适合用于脚本中。

 

   sed可以对文件中的内容进行编辑,但是它不改变原文件的内容,而是以行为单位,把正在编辑的行加载到内存的临时缓冲区中,处理之后发送到屏幕,然后删除缓存区中的内容,再加载下一行要处理的内容,直到处理完输入文件的最后一行才结束运行。而sed命令通过-i选项也可以直接更改原文件的内容,非常有用。

 

   与grep一样,sed在文件中查找模式的时候也要使用正则表达式和元字符(参见我的博客:grep命令详解)。正则表达式是括在斜杠间的模式,用于查找和替换等。

 

   sed命令的使用格式为:sed [options] "ADDRESScommand" filename...

 

 

  ADDRESS指sed的定址,用于决定对那些行进行编辑。地址的形式可以是数字,正则表达式或二者的结合。如果没有定址,默认sed将处理整个文件中的所有行。如果地址是一个数字,则代表行号。$用来指待输入文件的最后一行。如果给出的是逗号分隔的两个行号,那么处理的地址就是这两行之间的氛围(包括这两行),后面加命令的话用“\”。如果是正则表达式的话,就是处理与模式匹配的字符行,后面加命令的话用"/"。

   

   例:sed -n '1,2p' filename   显示文件的前两行

       sed -n '/ro.*/p' filename 显示文件由ro,后接任意字符的行 

       sed -n '/ro.*/=' filename 获取匹配行的行号

       sed -n '/anaconda/,/NOTICE/p' filename  打印匹配行之间的内容

       sed -n '/anaconda/,10p' filename  打印匹配行到第10行的内容

       sed  '/name/a\leeshengjia' filename  查找到文件的name字符串,然后再此行下面添加“leeshengjia”这个字符串

  

     

   下面我们来说说sed的常用命令:

   d  删除行

   例:sed '1d' filename 删除第一行的内容

       sed '/root/d' filename 删除有root的行

 

   p  显示(匹配的行再显示一遍)

   例:sed '1,2p' filename 第一行和第二行会显示两遍

 

   a\  在匹配行或者指定行后面新增加一行内容

   例:

sed '/who is lee/a\lee jia' filename  如果正则匹配到了who is lee这一行,就在这行后面添加一行

sed -i '1a/lee jia' filename 在文件第一行后面添加一行

  

   i\ 在匹配行的上一行新增加一行内容

 

   s   s表示用一个字符串替换另一个

   用法为:s@@@flag

   @只是一个字符,可以随意指定,但是必须是被替换和替换字符串中没有的。

   flag有两种:

       g:全局替换,即一行中只要匹配的全替换  

       i:忽略大小写,只匹配一行中的第一个,剩下的不替换

   例:sed 's@root@jia@g' filename 把文件中所有行中的root替换成jia

       sed 's@^root\(.*\)@jia\1@g' filename 把文件中所有以root为行首的行中,把root替换成jia,其余的不变

       sed 's@ROOT@jia@i' filename 把root或是ROOT替换成jia

 

   c\  替换,后面加字符串,替换m,n行之间的内容

   例:sed '/root/c\jia' filename 替换有root的行为jia

 

 

   sed常用的选项有:

   -n   只有经过sed处理的行才会被显示处理(默认输入文件中的内容都显示,处理的行会显示两遍)

   例:sed -n '1,2p' filename 只显示1,2行 

       sed -n 's/lee/LEE/p' test 只会显示被匹配的行

 

   -e   一个sed命令可以跟多个出来条件

   例:sed -e '1d' -e '2d' filename 

 

   -i   直接修改原文件

   例:sed -i '1i\########' filename 在filename文件的第一行插入#

         sed '1 s/11/aa/g' filename 把filename文件第一行的11全部替换成aa

   

   -f   读取sed脚本,可以把处理条件写入一个文件,然后用-f选项指定文件读取脚本

   例:脚本文件change中的内容为:s/lee/LEE/

       执行命令:

       echo leeshengjia |sed -f change  显示的是LEEshengjia

        

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