对sed的一些命令,若是不是很了解的话,很多脚本很难理解。可以用sedsed工具查看模式空间与保持空间的变化。


sedsed下载地址:

http://aurelio.net/projects/sedsed/#download



一个例子:

将多个空行合并成一个空行(sed & awk 中的例子):

[root@localhost awk]# cat c
c1

c2



c3


c4
[root@localhost awk]# sed  '/^$/{N;/\n$/D}' c
c1

c2

c3

c4


sedsed工具使用:

由于没有用到保持空间,所以用参数把保持空间的变化隐藏。

[root@localhost awk]# ./sedsed -d --hide=hold '/^$/{N;/\n$/D}' c
PATT:c1$
COMM:/^$/ {
PATT:c1$
c1
PATT:$
COMM:/^$/ {
COMM:N
PATT:\nc2$
COMM:/\n$/ D
PATT:\nc2$
COMM:}
PATT:\nc2$

c2
PATT:$
COMM:/^$/ {
COMM:N
PATT:\n$
COMM:/\n$/ D
PATT:$
COMM:/^$/ {
COMM:N
PATT:\n$
COMM:/\n$/ D
PATT:$
COMM:/^$/ {
COMM:N
PATT:\nc3$
COMM:/\n$/ D
PATT:\nc3$
COMM:}
PATT:\nc3$

c3
PATT:$
COMM:/^$/ {
COMM:N
PATT:\n$
COMM:/\n$/ D
PATT:$
COMM:/^$/ {
COMM:N
PATT:\nc4$
COMM:/\n$/ D
PATT:\nc4$
COMM:}
PATT:\nc4$

c4
[root@localhost awk]#



N:追加下一行。多行Next命令通过读取新的输入行,并将它添加到模式空间的现有内容之后,来创建多行模式空间,模式空间最初的内容和新的输入行之间用换行符分隔。

N命令读取新的输入行后,当命令完成,返回到开始,它会在刚才N读取的新的输入行后面的一条读取。如下面:

[root@localhost awk]# cat d
d5
d6
d7
d8
[root@localhost awk]# ./sedsed -d --hide=hold 'N' d
PATT:d5$
COMM:N
PATT:d5\nd6$
d5
d6
PATT:d7$
COMM:N
PATT:d7\nd8$
d7
d8
[root@localhost awk]#



D:删除模式空间中直到第一个嵌入的换行符的这部分内容,它不会导致读入新的输入行。它返回到脚本的顶端(即跳过D后面的语句),将这些指令应用于模式空间剩余的内容。

[root@localhost awk]# cat d
d5
d6
d7
d8
[root@localhost awk]# ./sedsed -d --hide=hold  'N;D;s/.*/a/' d
PATT:d5$
COMM:N
PATT:d5\nd6$
COMM:D
PATT:d6$
COMM:N
PATT:d6\nd7$
COMM:D
PATT:d7$
COMM:N
PATT:d7\nd8$
COMM:D
PATT:d8$
COMM:N
d8
[root@localhost awk]#