假设我们有一个包含以下内容的文件:
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>
所以整章都将在其中。
使用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
sed -ne '/^chapter 1/,/^chapter/{/^chapter/d;p}' file
你也可以通过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