- 论坛徽章:
- 0
|
请问sed的P命令和D命令的用法
理解
$!N 如果不是最后一行,就读入新行附加于pattern space之后,以“\n”分隔
理解
s/\n=/ / 如果发现了新行是以=开头的,替换为空格
理解
ta 如果找到了替换,从标签a处再执行,否则向下走
不理解,这条命令有分条件执行吗?为什么说“如果找到替换再到a执行”,s命令后不是都要执行ta这条命令吗,哪个命令指定这条ta是根据s的结果来处理的?
P 打印 pattern space中的第一个 \n之前的内容
D 删除pattern space中的第一个 \n之前的内容,并返回脚本头部执行
理解
第一行执行,没有找到 \n= 打印第一行,读入第二行,脚本头部执行
是不是先定义标号a,然后N读入下一行,然后执行s替换,因为没有找到替换,所以不执行ta?然后打印模式空间中\n前面内容,就是第一行,再删除模式空间\n前面内容即第一行,保留第二行。
第二行执行,找到 \n= ,替换为空格,从标签a处再执行
第三行执行,没有找到 \n= 打印第二三行的合并和第四行,读入新行,没有了,结束。
此时模式空间里面是第二行。先定义标号a,然后N读入下一行(第三行),然后执行s替换,这时\n就没有了,模式空间是2、3行的合并,然后ta,再N读入下一行(第四行),然后执行s替换,因为没有找到替换,所以不执行ta,然后打印模式空间中\n前面内容,就是二、三行的合并,删除后保留第四行。
这时再执行sed,定义标号a,发现是最后一行,所以N,s,t三个命令都不执行,执行P;D命令,打印第四行,再删除模式空间的内容。
我的理解对吗?
问题:N命令是由前面的$!决定是否执行的,这个我理解。s命令的执行条件是什么?是不是前面的N执行成功s才执行?t命令的执行条件是不是s命令成功才执行?-e :a和-e'P;D'是不是不管什么条件都执行?
请大虾赐教! |
|