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 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
更改标志。
您可以将 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 参数 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
假设我们有一个包含以下内容的文件:
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
更改标志。
您可以将 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 参数 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