【Linux】sed编辑器二

一、处理多行命令

sed编辑器有3种可用于处理多行文本的特殊命令。

  • N:加入数据流中的下一行,创建一个多行组进行处理;
  • D:删除多行组中的一行;
  • P:打印多行组中的一行。

1、next命令:N

单行next命令

单行next(n)命令会告诉sed编辑器移动到数据流中的下一行,不用再返回到命令列表的最开始位置。通常sed编辑器在移动到数据流中的下一行之前,会在当前行中执行完所有定义好的命令,而单行next命令却不一样。

如下所示,文本test.txt中有两行空行。

我们想只删除第一行空行,执行下面的命令却无法做到,它会将两行空行都删除掉。

bash 复制代码
sed '/^$/d' test.txt

可以用单行next命令解决此问题:

bash 复制代码
sed '/成都/{n ; d}' test.txt # d表示删除

先用脚本查找到含有"成都 "的那一行,然后,单行next命令(n) 会让sed编辑器移动到文本的下一行,也就是我们想要删除的空行,接着,sed编辑器继续执行命令列表中的命令,即使用删除命令(d) 删除空行。sed编辑器在执行完命令脚本后会读取数据流中的下一行文本,并从头开始执行脚本,但它却找不到包含"成都"的行了,所以就不会再删除其它行。

合并文本行

单行next(n)命令会将数据流中的下一行移入sed编辑器的工作空间(模式空间)。多行版本的next(N)命令则是将下一行添加到模式空间中已有文本之后。这样就会将数据流中的两行文本合并到同一个模式空间中,文本行之间仍然用换行符分隔,但sed编辑器会将两行文本当成一行来处理。

bash 复制代码
sed '/重庆/{N ; s/\n/ / }' test.txt

sed编辑器首先找到含有"重庆"的行,找到后,使用N命令将下一行与该行合并,接着使用替换命令s将换行符(\n)替换成空格。如此一来,两行文本就会成为一行后输出。

在数据文件中找到一个可能会分散在两行中的文本短语。

如下所示,电信和诈骗园区之间的 . 是用来匹配空格和换行符的,但如果它匹配到了换行符,就会删掉换行符,从而导致两行合并成一行。

可以使用两个替换命令解决上面两行合并成一行的问题。

第一个替换命令用来处理短语出现在单行中的情况,第二个替换命令用来处理短语出现在多行中的情况。

2、多行删除命令:D

sed编辑器中的多行删除命令(D)只会删除模式空间中的第一行,即删除该行中的换行符及其之间的所有字符。

删除目标数据字符串所在行的前一行。

bash 复制代码
sed '/^$/{N ; /缅北/D}' test.txt

sed编辑器首先会查找空行,然后用N命令将下一行加入模式空间,如果模式空间中有含有"缅北"的词语,那么D命令就会删除模式空间中的第一行。

3、多行打印命令:P

多行打印命令(P)只打印模式空间中的第一行,即打印模式空间中的换行符及其之前所有字符。当用-n选项来抑制脚本输出时,它就和显示文本的单行p命令的用法差不多。

相关推荐
工程师老罗10 分钟前
Ubuntu下怎么将u盘格式化为ext4?
linux·运维·ubuntu
study_小达人15 分钟前
ubuntu 22.04设置limit不生效
linux·运维·ubuntu
Johny_Zhao15 分钟前
黑客msfconsole渗透工具超详细使用说明
linux·python·网络安全·信息安全·渗透测试·云计算·系统运维·攻防演练
烈焰飞鸟24 分钟前
华为云前后端部署实战手册
运维·前端·vue.js·后端·华为云
挨踢攻城24 分钟前
Linux 下合并多个 PDF 文件为一个 PDF 文件的方法
linux·前端·rhce·rhca·linux运维·红帽认证·公众号:厦门微思网络
少云清28 分钟前
【接口测试】7_接口测试 _Jenkins源码管理问题
运维·jenkins
liulilittle28 分钟前
XDP VNP虚拟以太网关(章节:二)
linux·服务器·网络·c++·通信·xdp
qinyia28 分钟前
如何安全清理以 amis 开头的容器与镜像
运维·数据库·人工智能·mysql·ssh
比奇堡派星星28 分钟前
Linux 平台设备驱动框架详解
linux·开发语言·驱动开发
Data_agent30 分钟前
Eastmallbuy模式淘宝/1688代购系统搭建指南
java·运维·数据库