grep -A <num>直到字符串</num>

时间:2015-03-21 08:57:53

标签: linux bash grep fileparsing

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

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>所以整章都会在其中。

3 个答案:

答案 0 :(得分:2)

sed -ne '/^chapter 1/,/^chapter/{/^chapter/d;p}' file

答案 1 :(得分:1)

使用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更改了标记。


您可以将范围与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

答案 2 :(得分:1)

您也可以通过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