如何在bash shell中grep文件的一部分

epe*_*leg 8 linux grep

如何“grep”某个 string1 的出现和某个 string2 的(第 N 个)出现之间的行。

例如

如果文件有一行:

A
B
C
D
E

F
G
B
C
E

Q

我想以粗体显示行(以 B 开头并以 E 结尾的行)。

这可以使用grep完成吗?或其他一些 Unix 命令行工具?

Tho*_*hor 12

grep 不太适合此任务,您需要“向上”使用一个工具:

sed -n '/^B/,/^E/p' infile
Run Code Online (Sandbox Code Playgroud)

输出:

B
C
D
E
B
C
E
Run Code Online (Sandbox Code Playgroud)

关于第 N 个要求,我认为如果您再次“向上”推进一个工具,即 awk,这是最简单的:

awk '/^B/ { f = 1; n++ } f && n == wanted; /^E/ { f = 0 }' wanted=2 infile
Run Code Online (Sandbox Code Playgroud)

输出:

B
C
E
Run Code Online (Sandbox Code Playgroud)

该标志f将在/^B/遇到时设置并在/^E/发生时取消设置,与 sed 表示法的工作方式非常相似。n记录通过了多少块,当f == 1 && n == wanted为真时,将执行默认块 ( { print $0 })。