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用于第一a
前xyz
行并打印的所有行。
输出(第一次出现a
,我不关心a
文件中的其他 ):
5 a
6 b
7 c
8 d
9 xyz
10 xyz
Run Code Online (Sandbox Code Playgroud)
这是 Perl 中的解决方案:
perl -nlE '
if (/a/) { @buffer = ($_) }
elsif (/xyz/) { push @buffer,$_; say for @buffer }
else { push @buffer,$_}
' your_file
Run Code Online (Sandbox Code Playgroud)
这是如何运作的
它逐行读取文件并执行以下三件事之一:
a
,则将当前行分配给@buffer
数组。xyz
,则将当前行推送到缓冲区并打印缓冲区的内容@buffer
。因此,每当新行与模式匹配时a
, 的内容@buffer
都会被删除并仅由当前行替换。这保证您会找到最接近的a
前面的xyz
.
当然,您应该将我使用的正则表达式替换为与您的案例相关的实际正则表达式。