1

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

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

一个虚拟的方法是

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

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

4

3 回答 3

2
sed -ne '/^chapter 1/,/^chapter/{/^chapter/d;p}' file
于 2015-03-21T09:06:31.850 回答
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
于 2015-03-21T09:01:45.053 回答
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
于 2015-03-21T09:18:14.403 回答