bash - 打印两个模式之间的所有行,独占的,仅限第一个实例(在 sed、AWK 或 Perl 中)

标签 bash perl awk sed

<分区>

使用 sed、AWK(或 Perl),如何打印两个模式(的第一个实例)之间的所有行,不包括模式?1

即,作为输入给出:

aaa
PATTERN1
bbb
ccc
ddd
PATTERN2
eee

甚至可能:

aaa
PATTERN1
bbb
ccc
ddd
PATTERN2
eee
fff
PATTERN1
ggg
hhh
iii
PATTERN2
jjj

我希望,在这两种情况下:

bbb
ccc
ddd

1 作为this 的重复问题,许多用户投票决定关闭此问题。一。最后,我提供了一个 gist那证明他们是不同的。这个问题在表面上也类似于 a number of others ,但没有完全匹配,也没有一个是高质量的,而且,由于我认为这个特定问题是最常遇到的问题,它应该有一个明确的表述,以及一组正确、明确的答案。

最佳答案

如果您有 GNU sed(在 Mac OS X 上使用 4.7 版测试),最简单的解决方案可能是:

sed '0,/PATTERN1/d;/PATTERN2/Q'

解释:

  • d 命令从第 1 行删除到匹配 /PATTERN1/ 的行。
  • 然后 Q 命令退出,而不在匹配 /PATTERN2/ 的第一行打印。

如果该文件只有一个模式实例,或者如果您不介意提取所有这些实例,并且您想要一个不依赖于 GNU 扩展的解决方案,那么这个可行:

sed -n '/PATTERN1/,/PATTERN2/{//!p}'

解释:

  • 注意空正则表达式//重复最后一个正则表达式匹配。

关于bash - 打印两个模式之间的所有行,独占的,仅限第一个实例(在 sed、AWK 或 Perl 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55220417/

相关文章:

linux - 关于ubuntu 11.04生成的.profile的问题

perl - 我怎样才能确保我的程序在不同平台上找到 perl 解释器?

Perl 兼容性

regex - Perl 中的正则表达式

linux - 我怎样才能找到包含多个模式的文件

linux - 用于安排多个作业的 Bash 脚本

arrays - Array Bash 在多个数组的循环中打印元素

linux - Bash 脚本 Shell 脚本

unix - 使用 awk 在每列中显示唯一值

github - 将特殊的内联代码样式更改为 Markdown 中的 block 代码样式