【发布时间】:2019-06-04 05:12:44
【问题描述】:
我正在尝试使用 sed 命令从如下所示的文本文件中查找并打印两个可变行数的块:
...
INFO first block to match
id: "value"
...
last line of the first block
INFO next irrelevant block
id: "different value"
...
INFO second block to match
id: "value"
...
last line of the second block
...
我只知道 id 值以及每个块都以具有“INFO”的行开头的事实。我想匹配第一行中的每个块,而不是在输出中包含下一个块的第一行:
INFO first block to match
id: "value"
...
last line of the first block
INFO second block to match
id: "value"
...
last line of the second block
理想情况下,我宁愿一次性完成,而不是从上到下多次扫描文件。目前我有这个(它只匹配第一个块,我需要两个):
sed -n -e "/INFO/{"'$!'"{N;/INFO.*id: \"value\"/{:l;p;n;/^[^\\[]/bl;}}}" file.log
编辑
块之间的换行当然很好,但完全是可选的。
编辑 2
请注意INFO 和id: "value" 不必在行首,而且我的示例中的所有其他词都是任意的并且事先不知道。在我需要匹配的块之间和周围可以有任意数量的块(包括 0 个)。
【问题讨论】:
-
您的意思是您只想提取 ID?请通过编辑问题提供所需输出的示例。
-
awk 是完成此类任务的更好工具。使用 sed 进行简单的替换,仅此而已。
-
@oguz ismail awk 命令会是什么?
-
这样
awk '/^INFO/{p=0;a=$0;next} $0=="id: \"value\""{print a;p=1} p' file -
您的“EDIT 2”本质上是说您提供的示例不能充分满足您的要求。修复示例,否则我们没有可以测试潜在解决方案以查看它是否有效的东西。您在下面有多个答案,并且您在所有答案下方的 cmets 中为您的示例问题再次道歉 - 只需修复示例即可。最后,sed 用于对单个字符串执行 s/old/new - 这不是您正在执行的操作,因此您不应该考虑使用 sed。
标签: sed