2011年2月26日星期六

sed 高级命令

sed 在处理数据的过程中使用到了“模式空间”和“保持空间”这两个概念。“模式空间”的作用是缓冲区,即sed每次都将一行文本读入到模式空间中,然后进行处理。“保持空间”则起到了剪贴板的作用,可以利用相关命令将模式空间的部分内容保存到保持空间里,然后再进行处理。

sed 处理文本的过程相对简单:
1 读取一行文本到模式空间
2 将命令依次应用到模式空间的文本
3 输出模式空间内容(-n参数可以取消)

为了改变sed默认的工作流程,可以采用以下的高级命令改变sed读取文本的行为:
d 删除模式空间的内容,后续命令不再执行,读取新行
p 打印模式空间的内容
n 输出模式空间的内容(-n参数取消此行为),读取新行,覆盖模式空间内容,后续命令用于新的模式空间
q 输出模式空间内容(-n参数取消此行为),立即退出脚本
N 读取新行,追加到模式空间,后续命令用于新的模式空间
P 打印模式空间的第一行
D 删除模式空间中的第一行,回到脚本开始,将命令应用于新的模式空间
其中 NPD 命令可以构成处理多行模式的循环。

sed 还提供了5个命令用以操作“保持空间”:
h 模式空间 > 保持空间
H 模式空间 >> 保持空间
g 保持空间 > 模式空间
G 保持空间 >> 模式空间
x 模式空间 <> 保持空间

sed 还提供了label的概念,通过跳转到 label 处执行命令,改变了命令的执行顺序:
: —— 加标签
b —— b label,如果 label 为空,则跳转到结尾
t —— t label,如果 label 为空,则跳转到结尾。此命令与s替换命令连用,即 test 最后一个s命令的替换是否成功,若成功,则跳转,否则不做处理。