假设我们有一个包含以下内容的文件:
chapter 1 blah blah
blah num blah num
num blah num blah
...
blah num
chapter 2 blah blah
我们想要grep这个文件,所以我们采取行
从chapter 1 blah blah
到blah num
(下一章前的一行)。
我们唯一知道的是
chapter 1 blah blah
chapter
这样做的虚拟方法是
grep -A <num> -i "chapter 1" <file>
足够大<num>
所以整章都会在其中。
答案 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参数P
和z
。
$ 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