ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sed高级命令

2021-09-17 02:04:15  阅读:175  来源: 互联网

标签:header 高级 命令 sed line txt data


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 ; /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 命令会删除缓冲区中的第一行。

标签:header,高级,命令,sed,line,txt,data
来源: https://www.cnblogs.com/Aimmi/p/15302939.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有