grep -A <num> 直到一个字符串

grep -A <num> until a string

假设我们有一个包含以下内容的文件:

chapter 1 blah blah
blah num blah num
num blah num blah
...
blah num
chapter 2 blah blah

并且我们想要 grep 这个文件,所以我们采取这些行 从 chapter 1 blah blahblah num (下一章之前的行)。

我们唯一知道的是

  1. 表示字符串chapter 1 blah blah
  2. 在那之后的某处还有另一行以 chapter
  3. 开头

一个虚拟的方法是

grep -A <num> -i "chapter 1" <file>

足够大 <num> 所以整章都在里面。

这很容易做到 awk

awk '/chapter/ {f=0} /chapter 1/ {f=1} f' file
chapter 1 blah blah
blah num blah num
num blah num blah
...
blah num

如果标志 f 为真,它将打印该行。
chapter 1 和下一个 chapter 更改标志。


您可以将 range 与 awk 一起使用,但如果您有其他要测试的东西,它的灵活性会降低。

awk '/chapter 1/,/chapter [^1]/ {if (!/chapter [^1]/) print}' file
chapter 1 blah blah
blah num blah num
num blah num blah
...
blah num
sed -ne '/^chapter 1/,/^chapter/{/^chapter/d;p}' file

您也可以通过 grep 本身来完成此操作,但您需要启用 Perl-regexp 参数 Pz.

$ grep -oPz '^chapter 1[\s\S]*?(?=\nchapter)' file
chapter 1 blah blah
blah num blah num
num blah num blah
...
blah num

[\s\S]*? 将对零个或多个字符进行非贪婪匹配,直到到达开头有字符串 chapter 的行。

来自man grep

-z, --null-data           a data line ends in 0 byte, not newline
-P, --perl-regexp         PATTERN is a Perl regular expression
-o, --only-matching       show only the part of a line matching PATTERN