【发布时间】:2021-10-09 17:09:07
【问题描述】:
我有一个如下所示的数据文件:
a separator
interesting line 1
interesting line 2
a comment
interesting line 3
interesting line 4
interesting line 5
a non interesting line
some other data
interesting line 6
.
.
.
我想从每个连续组中提取第一个interesting line,无论组中有多少行,或者有多少额外的行分隔这些组。
对于上面的测试输入,输出将是:
interesting line 1
interesting line 3
interesting line 6
我可以在 python 中轻松地做到这一点,方法是在我匹配一行时触发一个状态变量,并在我遇到不匹配的行时重置,但是单行 shell 脚本呢?有没有一种不太模糊的方法来做到这一点?
【问题讨论】:
-
我不清楚您的问题是关于 bash 还是关于提供给 grep 的(多行)正则表达式?
-
我只想说这个问题对我来说很清楚,我不会关闭它。
-
我正在写一个无法再发布的答案:
grep -Pzo '([^\n]*interesting line[^\n]*data[^\n]*\n)+' file | while IFS='' read -d '' -r match; do head -n1 <<< "$match"; done。简而言之:使用带有 NUL 分隔匹配项的贪婪正则表达式的 grep,同时读取每个匹配项以仅打印它们的第一行。 -
@ArkadiuszDrabczyk 感谢您的评论,在编辑之前可能不太清楚,但是当投票和关闭过程开始时,很难改变它。
-
如果问题被重新打开,另一个可能的答案:
awk '/^interesting/ {if (NR>ingroup) print; ingroup=NR+1}'
标签: linux command-line