sed '1!G;h;$!d' filename
... [/quote]
! 放在一个地址或地址范围后,表示只对不符合该地址或地址范围的行才执行!后的命令。(地址或地址范围是匹配行的条件)
1 表示文件第一行
$ 表示文件最后一行
1!G 表示第一行不执行G(hold space附加到pattern space),即2到$执行G
h 复制pattern space的内容到hold space
$!d 最后一行($表示最后一行)不执行d, 即1到$-1执行d。d用来删除当前pattern space内容,并开始下一次循环去处理下一行。
1 第一行时,执行h把pattern space的内容(第一行的内容)复制到hold space;
执行d删除pattern space的内容,并开始下一次循环,
2 第二行至倒数第二行,先执行G把hold space的内容附加到pattern space(当前行),这样pattern space的内容就是前面所有行的内容加上当前行的内容(倒序的);
再执行h, 把pattern space的内容复制到hold space;
然后执行d删除pattern space的所有内容,开始下次循环。
3 最后一行,执行G;h(同2),但不执行d,执行默认输出动作输出pattern space的内容。
阅读(1370) | 评论(0) | 转发(0) |