sed高级命令

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了sed高级命令脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_512_1@sed高级命令

sed模式空间

首先,应该明白模式空间的定义。模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的。这对接下来的学习是有帮助的。

正常情况下,sed将待处理的行读入模式空间,脚本中的命令就一条接着一条的对该行进行处理,直到脚本执行完毕,然后该行被输出,模式空间请空;然后重复刚才的动作,文件中的新的一行被读入,直到文件处理完备。

但是,各种各样的原因,比如用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行。这个时候,sed设置了一些高级命令来满足用户的要求。

总的来说,这些命令可以划分为以下三类:

  1. N、D、P:处理多行模式空间的问题;
  2. H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑;
  3. :、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 ; /SystemnAdministrator/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 命令会删除缓冲区中的第一行。

脚本宝典总结

以上是脚本宝典为你收集整理的sed高级命令全部内容,希望文章能够帮你解决sed高级命令所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。