搜索一个模式并打印从另一个模式开始的前几行

use*_*813 5 grep text-processing

我需要 grep 一个模式,一旦我找到它,我需要在它之前寻找另一个模式并在它们之间打印所有这些行。

更好的例子:

1 a
2 a
3 a
4 a
5 a
6 b
7 c
8 d
9 xyz
10 xyz
11 a
12 a
Run Code Online (Sandbox Code Playgroud)

的grep为xyz然后用grep用于第一axyz行并打印的所有行。

输出(第一次出现a,我不关心a文件中的其他 ):

5 a 
6 b
7 c
8 d
9  xyz
10 xyz
Run Code Online (Sandbox Code Playgroud)

Jos*_* R. 1

这是 Perl 中的解决方案:

perl -nlE '
    if    (/a/)   { @buffer = ($_) }
    elsif (/xyz/) { push @buffer,$_; say for @buffer }
    else          { push @buffer,$_}
' your_file
Run Code Online (Sandbox Code Playgroud)

这是如何运作的

它逐行读取文件并执行以下三件事之一:

  1. 如果当前行与模式匹配a,则将当前行分配给@buffer数组。
  2. 如果当前行与模式匹配xyz,则将当前行推送到缓冲区并打印缓冲区的内容
  3. 如果上述两种情况都不成立,则它只是将当前行追加到数组中@buffer

因此,每当新行与模式匹配时a, 的内容@buffer都会被删除并仅由当前行替换。这保证您会找到最接近的a前面的xyz.

当然,您应该将我使用的正则表达式替换为与您的案例相关的实际正则表达式。