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

相关推荐
想唱rap11 分钟前
Linux线程
java·linux·运维·服务器·开发语言·mysql
JFSJFX28 分钟前
手机短信误删怎么办?这4种恢复办法亲测有效,轻松找回短信
运维·服务器
yuzhuanhei38 分钟前
docker常用命令
运维·docker·容器
無名路人39 分钟前
Zsh 脚本 + VS Code 任务:NestJS + Vue3 一键部署到 1Panel
运维·后端·自动化运维
anarckk42 分钟前
docker volume 导入导出命令
运维·docker·容器
cccccc语言我来了42 分钟前
Linux(9)操作系统
android·java·linux
Lueeee.42 分钟前
Linux驱动中为什么既有 sysfs,又有字符设备?以 DHT11 驱动为例彻底讲透
linux·驱动开发
信创DevOps先锋1 小时前
Gitee:中国开发者生态的数字化转型基石与创新加速器
运维·gitee·devops
xiaoliuliu123451 小时前
HBuilderX 4.2 前端开发工具安装教程:详细步骤+自定义安装路径
编辑器·sublime text
Crazy CodeCrafter1 小时前
房租年年涨,客流年年少,服装店还要开吗?
大数据·运维·微信·自动化·开源软件