学习sed总结

来源:互联网 发布:滴滴预约单抢单软件 编辑:程序博客网 时间:2024/06/02 09:23

    最近看完了sed与awk(第二版)的sed部分,总结一下所学的东西,也算在记忆一遍。

 

1. 基本格式

    sed [option] script filename

 

2. script: sed执行的脚本,也就是sed执行的命令

    格式:'[模式]过程'

    简单理解为:[addrs]instructions,即地址+指令

    地址:就是一个正则表达式,简单理解为行号也可以

    指令:sed基本指令和sed高级指令,下面介绍

   

    地址举例(以删除命令d为例):

      1> sed基本流程

    d:删除所有行,没有地址,默认是整个文件的所有行                                      

    1d:删除第一行,1就是地址,表示第一行

    1,4d:删除1到4行

    $d:删除最后一行

    /^$/d:删除空行

 

    /exp1/,/exp2/d:删除从符合正则表达式exp1到符合正则表达式exp2的行

 

    指令:可以是单个指令,也可以是一组指令(即在一行中应用多个指令)

             分组指令格式:/exp1/{ // 注意:

                                    instrction1

                                    ...

                                }

     书上说:左大括号必须在行末,右大括号本身占一行,且大括号后面不能有空格。但是我在GNU sed 4.2.1上测试,没有这些限制。

 

    3. sed基本命令

 

 

     先读取一行到模式空间,然后将脚本中的每一个指令(一个接一个地)应用到该行上,当到达脚本底部时,即运行完所有的指令后,输出模式空间内容,然后清除模式空间,然后读入新行到模式空间,...,直到最后一行。

      理解:

      a:sed是一行为单位进行处理的,这里的“处理”就是执行所有脚本中的指令。即读入一行,执行所有的脚本指令,输出执行结果,然后再读入一行,再执行所有的脚本指令,再输出执行结果;...

      b:并不是将脚本的一条指令应用到文件所有的行上

      c:前面指令处理的结果影响到后面的指令

      d:脚本指令只是对模式空间中的内容进行了处理,返回的结果也是模式空间中的内容,并没有改变源文件的内容,模式空间就是行缓存器,保持空间是一个临时缓存器,下面具体介绍

      e:待添加

 

      2>替换指令:s

      格式:[addr]s/patten/replacement/flags

      a:定界符:/。这里使用‘/’作为定界符,也可以用其他字符,换行符除外,当正则表示或替换模式中出现定界符时,用‘/’来转换

      b:replacement中特殊字符:

           &:表示patten的内容,即用于替换正则表示式的内容

           /n:匹配patten中“/(”“/)”中的内容

           /:转义其他字符,如&, /。

 

      3>删除指令:d

         删除模式空间的内容,当模式空间为“空”时,就不会再有其他指令执行,所以删除后sed会读取新行,从头再执行指令

      4>追加:a;插入:i;更改:c

         格式:[addr][a|i|c]/text

         a:‘/’后的所有字符都包含在text内,包含前导空格,嵌入空格,换行符

                当text是多行时,应在行最后加入‘/’,表示续行。

         b:追加到当前行之后,插入到当前行之前,替换匹配行所有字符、

         c:a、i指令不会改变模式空间内容,即通过a、i命令添加的内容不会被其他指令使用

              c指令改变模式空间内容

             思考:a、i指令不改变模式空间内容,但是最后可以正常输出,那么a、i指令的内容暂时存储在什么地方呢?书中没有介绍,待研究

 

      5> 转换指令:y

           主要用途:大小写转换,但是是转换模式空间所有的内容,不能只转换某一些字符串(如转换某个单词,单词的转换要用到sed高级指令)

 

       6>打印指令:p

           输出当前模式空间内容,可以用它随时查看模式空间内容

 

       7>下一步指令:n

           输出当前模式空间内容,并且读入下一行内容,继续执行n下面的指令,并没有按照sed基本流程那样,读取新一行时从开始再执行所有脚本指令,所以该指令改变了sed正常的流控制

 

       8> 读写文件指令:r、w

            格式:[addr]r|w filename

            a:addr必须是确定的行号,不能使行号范围

            b:r|w后有一个空格,空格后的所有字符都属于filename,包括前导空格、嵌入空格和换行符

            c:r指令也不会影响模式空间(书中没有说,但在GNU sed 4.2.1版本试验得出)

 

 

明天再写吧!

 

              

 

 

                                           

 

总结一下,可以归纳为一句话:

          sed基本流程:sed读取文件中的一行到模式空间,然后执行脚本指令,最后将模式空间内容输出,然后再读入下一行到模式空间。

          当然sed高级用法中可能回改变这一流程,改变的地方主要是在执行脚本命令后。例如:  不输出模式空间内容;不读入下一行到模式空间等