【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命令的用法差不多。

相关推荐
迃幵chen8 分钟前
高可用虚拟IP-keepalived
linux·服务器·tcp/ip
苹果醋333 分钟前
MySQL Binlog 同步工具go-mysql-transfer Lua模块使用说明
java·运维·spring boot·mysql·nginx
纪伊路上盛名在1 小时前
R、python all in one jupyter
ide·人工智能·python·jupyter·r语言·编辑器·学习方法
猫猫的小茶馆1 小时前
【IO编程】标准IO和文件IO的对比
linux·c语言·嵌入式硬件·microsoft·嵌入式实时数据库
学Linux的语莫1 小时前
k8s之pod生命周期
linux·运维·docker·容器·kubernetes
petunsecn1 小时前
Jenkins触发器--在其他项目执行后构建
运维·jenkins
启明真纳1 小时前
k8s物料清单工具——KubeClarity
linux·运维·云原生·容器·kubernetes·云计算
wanhengidc1 小时前
国内大带宽服务器的应用场景
运维·服务器
weisian1512 小时前
Mysql--运维篇--主从复制和集群(主从复制I/O线程,SQL线程,二进制日志,中继日志,集群NDB)
运维·sql·mysql
肉三2 小时前
安装 Jenkins 后无法访问用户名或密码且忘记这些凭证怎么办?
运维·servlet·jenkins