d Delete pattern space. Start next cycle.
删除模式空间中的全部行,继续进行下一行。
D Delete up to the first embedded newline in the pattern space. Start next cycle, but skip reading from the input if there is still data
in the pattern space.
在模式空间中删除掉第一行文本,开始从input中读取下一行,但是如果此时模式空间中还有文本行,将会再用这个数据行进行sed script一次。
解释:如果模式空间中只有一行数据,那么d和D效果一样,为什么呢,因为sed所有的命令都工作在模式空间(Pattern space)上,而模式空间保存着sed刚刚从输入中读取的行;其中D命令表示只删除模式空间内的第一行,而d则将当前模式空间中的所有数据删除。如果模式空间中只有一行数据,用D和d都会删除这一行数据,但是如果模式空间中有多行数据,例如通过N命令可以使得sed将当前行的下一行数据附加到当前行后面,然后作为一个整体由sed命令处理,也就是说这个情况下模式空间有两行数据,这个时候用d命令将会删除掉着两行,但是用D命令的话,sed只会删除第一行,剩下还有一行数据,这个时候sed不会马上跳过着一行数据,叫sed继续从input中读取新的一行到模式空间中,而是继续用这一行数据和之前的数据行一样执行sed script;而d呢?它删除完模式空间中的数据以后,因为当前模式空间中没有数据了,它会叫sed从input中继续读入下一行,然后处理。
/ +++++++++++++++++++++++++++++++++++++++例子21+++++++++++++++++++++++++++++++++++++
sed.txt的内容为:
This is a dog.
This is a cat.
sed命令放在sed.script 文件中,脚本如下:
/dog/{ #选择含有dog的行
N #将当前行的下一行追加到当前行,并用换行符隔开
d #删除当前模式空间的全部行
}
/cat/{ #选择含有cat的行
s/cat/lion/g #将cat替换为lion
}
p #打印当前行
运行以后没有输出任何行;将上面的d改为D以后运行,结果为:
This is a lion.
流程:首先sed读入This is a dog.由于匹配了/dog/,执行N 将 当前行的下一行即:This is a cat.
追加到当前行,用换行符隔开,所有当前行的内容为:
This is a dog./nThis is a cat.接下来如果是d,则会删除This is a dog./nThis is a cat.由于已经没有输入行了,sed退出;如果是D,则只会删除This is a dog./n;剩下的This is a cat.将会被控制流送到脚本开始,重新匹配/dog/,由于匹配不成功,控制流跳到/cat/,由于匹配成功了,将cat替换为lion,最后打印出来,sed退出。
/+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
h H Copy/append pattern space to hold space.
将模式空间(Pattern space)中的数据复制/追加到保留空间(Hold space)中。
补充:sed有两个缓冲区:模式空间(Pattern space)和保留空间(Hold space);所有的命令都工作在模式空间上,模式空间保存着sed刚刚从输入中读取的行,保留空间作为临时缓冲区,可以在sed script操作模式空间中的数据的时候用来暂存模式空间上的数据,在将数据放入保留空间的之前,保留空间的内容为空;h将模式空间中的内容复制到保留空间中,同时保留空间中原来的数据将会全部丢失,H只会将模式空间的内容附加到保留空间原有内容的后面同时用一个换行符隔开。
/ +++++++++++++++++++++++++++++++++++++++例子22+++++++++++++++++++++++++++++++++++++
sed.txt的内容为:
This is a dog.
This is a cat.
This is a horse
sed.script脚本文件的内容为(每个指令一行):
1{ #选择第一行
h #将第一行从模式空间复制到保留空间
d #删除当前模式空间的全部行,继续读入下一行
}
2{ #选择第二行
h #将第二行从模式空间复制到保留空间,这个时候,保留空间的内容会被覆盖
d #删除当前模式空间的全部行,继续读入下一行
}
G #将当前保留空间的内容追加到当前行,也就是第三行后,用换行符隔开
p #打印当前模式空间的内容
运行sed命令:sed –n –f sed.script sed.txt 结果为:
This is a horse
This is a cat.
如果将sed.script 中
2{ #选择第二行
h #将第二行从模式空间复制到保留空间,这个时候,保留空间的内容会被覆盖
d #删除当前模式空间的全部行,继续读入下一行
}
的h换成H 即
2{ #选择第二行
h #将第二行从模式空间追加到保留空间,并用换行符隔开
d #删除当前模式空间的全部行,继续读入下一行
}
再次运行sed命令:sed –n –f sed.script sed.txt 结果如下:
This is a horse
This is a dog.
This is a cat.
/+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++