如何grep开始和结束模式之间的行?

Spi*_*ike 45 grep sed awk text-processing

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

zdk
aaa
b12
cdn
dke
kdn
Run Code Online (Sandbox Code Playgroud)

输入 1:aaacdn

输出 1:

aaa
b12
cdn
Run Code Online (Sandbox Code Playgroud)

输入 2:zdkdke

输出 2:

zdk
aaa
b12
cdn
dke
Run Code Online (Sandbox Code Playgroud)

我可以使用以下命令来实现:

grep -a aaa -A2 file # Output 1
grep -a aaa -A4 file # Output 2
Run Code Online (Sandbox Code Playgroud)

但是在文件中我不知道结束字符串模式的确切出现(位置)是什么(文件有 20000 行)

我怎样才能做到这一点?

fed*_*qui 54

grep不会在这里帮助你。sed使用范围表达式可以更好地完成这项工作:

$ sed -n '/aaa/,/cdn/p' file
aaa
b12
cdn
$ sed -n '/zdk/,/dke/p' file
zdk
aaa
b12
cdn
dke
Run Code Online (Sandbox Code Playgroud)

sed -n禁止自动打印,以便在明确要求时打印行。当范围/aaa/,/cdn/发生时,就会发生这种情况。

这些范围表达式也可在 中使用awk,您可以在其中说:

awk '/zdk/,/dke/' file
Run Code Online (Sandbox Code Playgroud)

当然,所有这些条件都可以扩展为更严格的正则表达式,例如sed -n '/^aaa$/,/^cdn$/p' file检查行是否恰好包含在aaaand 上cdn,仅此而已。

  • @KipK 范围表达式是解决此类问题的非常有用的工具 :) 您也可以使用 `awk` 和一些标志,但基本情况非​​常简单。 (2认同)
  • 有什么方法可以*不*打印开始和结束模式本身(除了使用头和尾)? (2认同)