grep -A 直到一个字符串

问题描述 投票:1回答:3

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

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

linux bash grep fileparsing
3个回答
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
投票
sed -ne '/^chapter 1/,/^chapter/{/^chapter/d;p}' file

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
© www.soinside.com 2019 - 2024. All rights reserved.