一、示例文件及需求:
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