首页 > 代码库 > sed详解与入门

sed详解与入门

        sed,stream editor,流编辑器,输入一段文本,通过处理,得到修改的文本,一个很简单却又很复杂的功能,简单在于只是处理文本,复杂在于需要支持文本处理的全部要求,增删查改等功能。

源文件file,下列操作都是以此文件操作:

first
second
third
first sed

         增:

  1. 增加一行文字:sed ‘1 a this is a line‘ file;a代表append;

  2. first
    this is a line
    second
    third
    first sed
  3. 插入一行文字:sed ‘1 i this is a line‘ file;i代表insert;

  4. this is a line
    first
    second
    third
    first sed
  5. 在行首或行尾增加一个单词:sed ‘s/^/#/‘ file;s代表substitute,^代表行首,$代表行尾;

  6. #first
    #second
    #third
    #first sed

        删:

  1. 删除一行文字:sed ‘2 d‘ file;d代表delete;

  2. first
    third
    first sed
  3. 删除多行文字:sed ‘2,3 d‘ file;2,3代表起始行号和终止行号;

  4. first
    first sed
  5. 删除某个单词:sed ‘s/first//g‘ file;g代表global;替换全部first为空,如果是数字n,则替换第n个first,如果是数字n和g,如2g,则替换第n个之后的first;

  6. second
    third
     sed

        查:

  1. 打印某行:sed -n ‘2 p‘ file;p代表print;

  2. second
  3. 打印多行:sed -n ‘1,2 p‘ file-n选项代表不输出模式空间的数据(什么是模式空间后面会说);

  4. first
    second
  5. 打印包含某个单词的行: sed -n ‘/first/p‘ file;匹配first,也可以使用正则表达式;

  6. first
    first sed
  7. 打印包含A单词又包含B单词的行:sed -n ‘{/first/{/sed/p}}‘ file;大括号{}代表嵌套命令,先匹配first,在匹配sed,然后p,或者用d删除等都可以;

  8. first sed
  9. 打印包含A单词却不包含B单词的行:sed -n ‘{/first/{/sed/!p}}‘ file;感叹号!代表非,反操作;

  10. first
  11. 打印包含A单词的后续几行:sed -n ‘/second/,+1p‘ file;+1代表后续一行;

  12. second
    third
  13. 打印奇数或偶数行:sed -n ‘p;n‘ filesed -n ‘n;p‘ file;前者奇数行,后者偶数行;分号;代表执行多个sed命令,使用-e选项,如sed -e ‘……‘ -e ‘……‘ file 也有同样效果;至于n命令后面会谈到。

  14. first
    third
    second
    fisrt sed

        改:

  1. 将A修改为B:sed ‘ s/first/one/g‘ file

  2. one
    second
    third
    one sed
  3. 将某行从小写转换为大写:sed ‘2 y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/‘ file;y代表yank(猜测与vim的y代表的意思是差不多的);其实就是映射,a映射为A,b映射为B;

  4. first
    SECOND
    third
    first sed
  5. 替换某行的文字:sed ‘1 c abc‘ file;c代表change;

  6. abc
    second
    third
    first sed

    以上是sed的一些使用例子,下面谈谈它的其它内容。

    pattern space(模式空间)与选项-n

    模式空间在sed里对初学者是特别难懂的一个东西,说白了,它就是一个缓冲区,将数据读入缓冲区,在缓冲区处理,并输出缓冲区的内容,这也就是为什么不会修改源文件的内容。

    至于选项-n,要求sed不输出缓冲区的内容,大部分都只有打印时才会使用,大致流程如下伪代码:

    for line in file                        //循环读入每行数据
     do
          pattern_space = line              //将当前行数据写入模式空间
          pattern_space = exec(sed_cmd,pattern_space)  //执行sed的命令,并将处理完的数据写回模式空间
          if "-n" no exist                  //如果没有选项-n
                print pattern_space         //则输出模式空间的数据
     done

    选项-i,直接修改源文件

    上述的sed操作执行都不会对源文件作任何改动,相当于copy了一个副本出来操作相应的命令,但如果我们需要直接在源文件上修改,该怎么办,查man会知道,-i选项会使命令在源文件上操作。

    地址

    在使用sed,命令的格式都类似这样,“1,2s/a//g”,"2p","1,3d","/wo/,+3p","2!p","p";sed处理的数据,都有起始行,到结束行,限定一定的区域,大致的格式是这样,[begin,[end]][!]cmd,begin或end可以由数字或者正则式表示。

    n与N

    看别人的sed脚步,有时会看到n与N命令,类似这样的,sed -n ‘n;p‘ file,代表输出偶数行,单独的一个p肯定是输出全部的,那多了个n为什么就是偶数行?了解一下n或N命令做了什么事。

    •  n,sed先读取第一行到模式空间,调用n命令,读取第二行,覆盖模式空间;n>模式空间

    • N,sed先读取第一行到模式空间,调用N命令,读取第二行,追加到模式空间;N>>模式空间

        g与G、h与H、x

        这几个命令,与另一概念有关,hold space,相当于模式空间的缓冲区,与n/N命令相似,g与h都是覆盖,G与H都是追加;

        g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除

        G: 将hold space中的内容append到pattern space\n后

        h: 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除

        H: 将pattern space中的内容append到hold space\n后

        x: 交换pattern space和hold space的内容

        举个栗子:


pattern space
hold space
abc \n
g \n
\n
G abc\n
\n
h abc abc
H abc \nabc
x \n abc
    附:

    使用的一些相关正则:

    (^):开头

    ($):结尾

    (\<):词首

    (\>):词尾

    (.):任何单字符

    (*):某个字符出现0次或多次

    ([  ]):字符集合

    (&):被匹配的变量

    (=):行号