一尘不染

如何在包含特定搜索字符串的两个大括号之间获取多行字符串?

linux

我正在寻找一种快速简便的单行代码,以从文本文件中提取所有包含搜索字符串的大括号分隔的文本块。我只是为此而在Google上发疯,但是每个人似乎都只是在发布有关在没有搜索字符串的情况下在大括号之间获取文本的信息。

我有一个大型文本文件,其内容如下:

blabla
blabla {
  blabla
}
blabla
blabla {
  blabla
  blablaeventblabla
}
blabla

方括号中的绝大多数条目都不包含搜索字符串,即“事件”。

我要提取的是每组花括号之间的所有文本(尤其是多行匹配),但前提是所述文本还包含搜索字符串。因此输出如下:

blabla {
  blabla
  blablaeventblabla
}

我的linux命令行是/ usr / bin / bash。我一直在尝试各种grep和awk命令,但无法使其正常工作:

awk '/{/,/event/,/}/' filepath

grep -iE "/{.*event.*/}" filepath

我当时以为这很容易,因为这是一项常见的任务。我在这里想念什么?


阅读 331

收藏
2020-06-03

共1个答案

一尘不染

这个gnu-awk应该可以工作:

awk -v RS='[^\n]*{|}' 'RT ~ /{/{p=RT} /event/{ print p $0 RT }' file
blabla {
   blabla
   blablaeventblabla
}

RS='[^\n]*{\n|}'将输入记录分隔符设置为任意文本,后跟{OR
}RT是内部awk变量,该变量设置为基于RS正则表达式的匹配文本。

2020-06-03