关于sed的N命令

N命令很简单,就是把下一行追加到匹配空间中,我一直都是这么理解的,直到我遇到这么个问题:

~% echo -e ‘anbncndne’ | sed -ne ‘N;/$/{s/cnd/FF/;p}’
a
b
FF
~% echo -e ‘anbncndne’ | sed -ne ‘N;/$/{s/bn.*nd/FF/;p}’
a
b
c
d

按理说我每次都用N,最后得到的应该是:”anbncndne”才对啊!怎么就这么奇怪呢?所以我开始怀疑对N的理解,有人告诉我可以这么测试:

$ echo ‘a
b
c
d
e’ | sed -ne ‘N;/$/{s/.*/>&</;p}’
>a
b<
>c
d<

哈!现在问题一目了然了!出问题的不是N,N确实每次都读入了下一行,但是,sed下次再调用N时已经将下下一行读入并覆盖掉匹配空间了!所以,解决方法就是不让它替换掉!怎么办呢?一个方法就是有sed的”goto”:

$ echo -e ‘a
b
c
d
e’ | sed -ne ‘:t;N;$!bt;s/bn.*nd/FF/;p’

可见,sed很拧把却又很强大!理解这个强大确实得下一番功夫!把文本编辑的逻辑抽象成一个个sed的命令,Lee E. McMahon很牛x!同时我们也可以看出:牛人们玩的都是抽象~!而我们这些非牛们只能玩玩实现了~ :-)