sed高级命令
sed模式空间
首先,应该明白模式空间的定义。模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的。这对接下来的学习是有帮助的。
在正常情况下,sed将待处理的行读入模式空间,脚本中的命令就一条接着一条的对该行进行处理,直到脚本执行完毕,然后该行被输出,模式空间请空;然后重复刚才的动作,文件中的新的一行被读入,直到文件处理完备。
但是,各种各样的原因,比如用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行。这个时候,sed设置了一些高级命令来满足用户的要求。
总的来说,这些命令可以划分为以下三类:
- N、D、P:处理多行模式空间的问题;
- H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑;
- :、b、t:在脚本中实现分支与条件结构。
多行模式空间的处理: 由于正则表达式是面向行的,因此,如若某个词组一不分位于某行的结尾,另外一部分又在下一行的开始,这个时候用grep等命令来处理就相当的困难。然而,借助于sed的多行命令N、D、P,却可以轻易地完成这个任务。
多行Next(N)命令是相对于next(n)命令的,后者将模式空间中的内容输出,然后把下一行读入模式空间,但是脚本并不会转移到开始而是从当前的n 命令之后开始执行;而前者则保存原来模式空间中的内容,再把新的一行读入,两者之间依靠一个换行符"\n"来分隔。在N命令执行后,控制流将继续用N命令以后的命令对模式空间进行处理。
值得注意的是,在多行模式中,特殊字符"^"和"$"匹配的是模式空间的最开始与最末尾,而不是内嵌"\n"的开始与末
sed命令
sed 包含了三个可用来处理多行文本的特殊命令,分别是:
- Next 命令(N):将数据流中的下一行加进来创建一个多行组来处理。
- Delete(D):删除多行组中的一行。
- Print(P):打印多行组中的一行。
- 注意,以上命令的缩写,都为大写。
N 多行操作命令
N 命令会将下一行文本内容添加到缓冲区已有数据之后(之间用换行符分隔),从而使前后两个文本行同时位于缓冲区中,sed 命令会将这两行数据当成一行来处理。
下面这个例子演示的 N 命令的功能:
[root@localhost ~]# cat data.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
[root@localhost ~]# sed '/first/{ N ; s/\n/ / }' data.txt
This is the header line.
This is the first data line. This is the second data line.
This is the last line.
在这个例子中,sed 命令查找含有单词 first 的那行文本。找到该行后,它会用 N 命令将下一行合并到那行,然后用替换命令 s 将换行符替换成空格。结果是,文本文件中的两行在 sed 的输出中成了一行。
下面这个例子就是用sed 匹配到header这一行的内容,再使用N将匹配到内容和下一行加入到模式空间;然后使用替换命令将line. 和换行 转换成and;最后结果就是将两行转换为了一行。
[root@localhost ~]# cat data4.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
[root@localhost ~]# sed '
/header/{
N
s/line.\n/and /
}' data4.txt
This is the header and This is the first data line.
This is the second data line.
This is the last line.
$!N:
它是除了匹配到的最后一行不执行N命令,其他所有行都要执行N命令。
[root@localhost ~]# cat data5.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
This is and.
[root@localhost ~]# sed '
/line./{
$!N
s/\nThis/ and Thia/
}' data5.txt
This is the header line. and Thia is the first data line.
This is the second data line. and Thia is the last line.
This is and.
D 多行删除命令
sed 不仅提供了单行删除命令(d),也提供了多行删除命令 D,其作用是只删除缓冲区中的第一行,也就是说,D 命令将缓冲区中第一个换行符(包括换行符)之前的内容删除掉。
如:
[root@localhost ~]# cat data2.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
[root@localhost ~]# sed 'N ; /System\nAdministrator/D' data2.txt
Administrator's group meeting will be held.
All System Administrators should attend.
文本的第二行被 N 命令加到了缓冲区,因此 sed 命令第一次匹配就是成功,而 D 命令会将缓冲区中第一个换行符之前(也就是第一行)的数据删除,所以,得到了如上所示的结果。
如下,它会删除数据流中出现在第一行前的空白行:
[root@localhost ~]# cat data3.txt
This is the header line.
This is a data line.
This is the last line.
[root@localhost ~]# sed '/^$/{N ; /header/D}' data3.txt
This is the header line.
This is a data line.
This is the last line.
sed会查找空白行,然后用 N 命令来将下一文本行添加到缓冲区。此时如果缓冲区的内容中含有单词 header,则 D 命令会删除缓冲区中的第一行。