gpt4 book ai didi

linux - 查找关键字之间的所有信息

转载 作者:太空宇宙 更新时间:2023-11-04 03:41:05 26 4
gpt4 key购买 nike

我想搜索给定的单词并检索一对关键字之间的所有周围行:

我有以下数据

NEW:
this is stackoverflow
this is a ghi/enlightening website
NEW:
put returns between paragraphs
indent code by 4 spaces
NEW:
here is this
most productive website
this is abc/enlightening/def

现在我想检索两个带有“enlightening”一词的NEW之间的所有信息。也就是说,对于上面的示例输入,我想要以下输出:

OUTPUT:
NEW:
this is stackoverflow
this is a ghi/enlightening website
NEW:
here is this
most productive website
this is abc/enlightening/def

我知道 grep 允许我搜索一个单词——但它只检索指定数量的行,例如5(由用户指定)在给定单词的上方和下方。但是我如何找出linux中任何关键字之间的所有信息(在本例中为“NEW”)。例如。我在这里将分隔关键字指定为“NEW”,并将任意两个新之间的信息称为段落。所以,我的第一段是:

this is stackoverflow
this is a ghi/enlightening website

我的第二段是:

put returns between paragraphs
indent code by 4 spaces

等等。

现在我想要所有包含关键字“启发”的段落。即我想要以下输出:

OUTPUT:
NEW:
this is stackoverflow
this is a ghi/enlightening website
NEW:
here is this
most productive website
this is abc/enlightening/def

最佳答案

下面的 AWK 命令应该可以工作(无论如何对于 mawk 来说——POSIX 似乎不允许 RS 是任意字符串):

awk -vRS='NEW:\n' -vORS= '/enlightening/ { print RS $0 }' data

说明:

  • -vFOO=BAR 是变量赋值。

  • RS(记录分隔符)设置为 NEW:\n 会使记录由 NEW:\n 分隔,而不是按行分隔。

  • ORS 设置为空字符串会删除输出记录后的多余空白行。 (另一个选项是将其设置为 NEW:\n,如果 NEW:\n 出现在记录之后就可以了。)

  • /enlightening/{ print RS $0 } 为包含“enlightening”的每条记录打印记录分隔符,后跟整个匹配记录 ($0)。

如果在记录后面出现分隔符是可以的,那么命令可以简化为以下内容:

awk -vRS='NEW:\n' -vORS='NEW:\n' '/enlightening/' data

未指定操作时的默认操作是打印记录。

为了严格遵守 POSIX,在两个 NEW: 之间将行附加到临时缓冲区,并且仅在看到搜索词(可以使用标志)时才打印该缓冲区应该可以工作,尽管它更复杂。

关于linux - 查找关键字之间的所有信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29617404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com