我有一份档案

###
A
B
C
@@@
###
D
E
F
@@@
###
G
H
I
@@@

我想删除#和@之间的所有行(如果它包含A

我怎样才能做到这一点呢?

预期结果

###
D
E
F
@@@
###
G
H
I
@@@

我试过了

sed "/###/,/@@@/d"

但这是在移除一切.

如果我们可以有多个文本模式,比如删除#和@之间的所有内容,如果它包含‘A’或‘D’,甚至会很有帮助.

谢谢.

推荐答案

您可以使用

sed '/###/{:a;N;/@@@/!ba;/A/d}' file

Details:

  • /###/-查找###,一旦找到,
  • :a-在当前位置设置a个标签
  • N-读取下一行,将其附加到模式空间
  • /@@@/!ba-如果有@@@个停止处理块,则转到a标签
  • /A/d-如果匹配的块内有A,则将其删除.

请参阅online test:

#!/bin/bash
text=$(echo -e '###\nA\nB\nC\n@@@\n###\nD\nE\nF\n@@@\n###\nG\nH\nI\n@@@')
sed '/###/{:a;N;/@@@/!ba;/A/d}' <<< "$text"

输出:

###
D
E
F
@@@
###
G
H
I
@@@

Linux相关问答推荐

没有发现运行时依赖关系,但它在S的运行时路径中有吗?

在64位Linux Mint 21.2 Mate上呈现nvim中的文本对象时出现问题

如何在Linux上获取clang中的模板实例化统计?

可以用openmp并行化内存分配删除吗? (c++)

使用 bash 命令将文件从子文件夹复制到另一个

sed:用空格替换

中的换行符

将特定列转换为行

查找更高版本的文件

使用带有 gnome-keyring 的 Git 凭证助手作为 Sudo 时出错

MessageBox 的 GTK 实现

使用 Bash 获取特定文件的 mtime?

从 Linux shell 将多个文件从一个目录复制到另一个目录

Linux批量转换:使用转换更改jpg的质量但保留其名称

Linux命令删除.git文件夹以外的所有文件?

execv() 和 fork() 的时间浪费

如何在 Linux 中查看日志(log)文件并在查看时应用自定义过滤器?

带有日期和时间的 Linux 命令历史记录

在 Docker 容器中运行的 JVM 的驻留集大小 (RSS) 和 Java 总提交内存 (NMT) 之间的差异

Linux 上的最大文件/目录数?

如何拖尾除第一行以外的所有行