sed实例分析(一)---P与D命令的用法

一、示例文件及需求:

catfile

111111111111111111

222222222222222222

=333333333333333333

444444444444444444

如果某行以=开始,则合并到上一行并替代=为空格

二、sed脚本执行结果:

sed-e:a-e'$!N;s/\n=//;ta'-e'P;D'file

111111111111111111

222222222222222222333333333333333333

444444444444444444

三、命令说明:

:a定义一个标签位置

$!N如果不是最后一行,就读入新行附加于patternspace之后,以“\n”分隔

s/\n=//如果发现了\n=的,替换为空格

ta如果找到了替换,从标签a处再执行,否则向下走

P打印patternspace中的第一个\n之前的内容

D删除patternspace中的第一个\n之前的内容,不打印模式空间,如果有模式空间还有数据,不会读取新行,继续开始下一循环

四、执行流程分析:

第一行执行,没有找到 \n= 打印第一行,读入第二行,脚本头部执行
第二行执行,找到 \n= ,替换为空格,从标签a处再执行
第三行执行,没有找到 \n= 打印第二三行的合并和第四行,读入新行,没有了,结束

 

COMM:代表命令,PATT:代表patternspace的内容,其他为sed输出的内容

PATT:111111111111111111$

COMM::a

COMM:$!N

PATT:111111111111111111\n222222222222222222$

COMM:s/\n=//

PATT:111111111111111111\n222222222222222222$

COMM:ta

COMM:P

111111111111111111

PATT:111111111111111111\n222222222222222222$

COMM:D

PATT:222222222222222222$

COMM::a

COMM:$!N

PATT:222222222222222222\n=333333333333333333$

COMM:s/\n=//

PATT:222222222222222222333333333333333333$

COMM:ta

COMM:$!N

PATT:222222222222222222333333333333333333\n444444444444444444$

COMM:s/\n=//

PATT:222222222222222222333333333333333333\n444444444444444444$

COMM:ta

COMM:P

222222222222222222333333333333333333

PATT:222222222222222222333333333333333333\n444444444444444444$

COMM:D

PATT:444444444444444444$

COMM::a

COMM:$!N

PATT:444444444444444444$

COMM:s/\n=//

PATT:444444444444444444$

COMM:ta

COMM:P

444444444444444444

PATT:444444444444444444$

COMM:D

五、参考:

http://bbs.chinaunix.net/thread-277289-1-1.html

 

你可能感兴趣的:(脚本,sed)