sed详解与入门

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

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

first
second
third
first sed

         增:

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

first
this is a line
second
third
first sed

插入一行文字:sed '1 i this is a line' file;i代表insert;

this is a line
first
second
third
first sed

在行首或行尾增加一个单词:sed 's/^/#/' file;s代表substitute,^代表行首,$代表行尾;

#first
#second
#third
#first sed

        删:

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

first
third
first sed

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

first
first sed

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

second
third
 sed

        查:

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

second

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

first
second

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

first
first sed

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

first sed

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

first

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

second
third

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

first
third
second
fisrt sed

        改:

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

one
second
third
one sed

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

first
SECOND
third
first sed

替换某行的文字:sed '1 c abc' file;c代表change;

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
Gabc\n
\n
habcabc
Habc\nabc
x\nabc
    附:

    使用的一些相关正则:

    (^):开头

    ($):结尾

    (\<):词首

    (\>):词尾

    (.):任何单字符

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

    ([  ]):字符集合

    (&):被匹配的变量

    (=):行号


转载于:https://my.oschina.net/CppMonkey/blog/287765

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值