我想用 sed 过滤一些标准输出,但我不知道如何。标准输出示例是:
.
.
.
Model a. # This should be captured
.
.
.
Metrics results: # This should be captured
==================== # This should be captured
metric 1 # This should be captured
metric 2 # This should be captured
metric 3 # This should be captured
==================== # This should be captured
.
.
.
Model b # This should be captured
.
.
.
Metrics results: # This should be captured
==================== # This should be captured
metric 1 # This should be captured
metric 2 # This should be captured
metric 3 # This should be captured
==================== # This should be captured
.
.
.
其中.
表示包含任何随机字符的行。所以结果是
Model a
Metrics results:
====================
metric 1
metric 2
metric 3
====================
Model b
Metrics results:
====================
metric 1
metric 2
metric 3
====================
我可以使用什么 sed 命令?还将感谢有关如何了解 sed 的解释。
在您需要的问题中,但标签中
sed
有grep 。因为这样的过滤grep
对我来说似乎是一个更自然的选择。在这里,我尝试创建一个紧凑的表达式,但 note
[Mm]etrics?
不会过滤掉 egMetric whatever
并且^=+$
会匹配包含单个=
. 因此,您可能更喜欢不那么紧凑、限制性更强的表达式,如下所示:Metrics results:
我假设在包含or的行中没有尾随空格====================
。由于# This should be captured
您添加的这些,我无法真正判断这是否是一个好的假设。如果需要,调整表达式(删除一个或两个$
锚点可能是一种调整)。经 GNU
grep
3.7 测试。使用的语法概述:
grep -E
将grep
模式解释为扩展正则表达式 (ERE)。grep
不-E
使用基本正则表达式 (BRE)。您的问题可以通过 BRE 解决。我选择 ERE 是因为模式看起来更简单(即它们更易于阅读)。foo|bar|baz
匹配foo
orbar
或baz
. 这需要grep -E
. 没有-E
它会foo\|bar\|baz
。^
在表达式的开头是与行首匹配的锚点。$
在末尾匹配行尾。[Mm]
匹配M
或m
。s?
匹配零或一s
。这需要-E
. 没有-E
它会是s\?
1。=+
匹配一个或多个=
字符。这需要grep -E
. 没有-E
它会是=\+
1。或者可以==*
用于此(=*
匹配零个或多个=
字符)。没有的第一个命令
-E
:1
\?
并且\+
不是 POSIX BRE 标准的一部分。您可能知道这一点,但以防万一:您
cmmnd
使用