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

Linux 如何在包含特定搜索字符串的两个大括号之间获取多行字符串?,linux,bash,Linux,Bash,我正在寻找一个快速简单的一行程序,从文本文件中提取包含搜索字符串的所有以大括号分隔的文本块。我几乎在谷歌上发疯了,但每个人似乎都只在大括号之间发布没有搜索字符串的文本 我有一个大的文本文件,内容如下: blabla blabla { blabla } blabla blabla { blabla blablaeventblabla } blabla blabla { blabla blablaeventblabla } 绝大多数括号内的条目不包含搜索字符串,即“事件” 我

我正在寻找一个快速简单的一行程序,从文本文件中提取包含搜索字符串的所有以大括号分隔的文本块。我几乎在谷歌上发疯了,但每个人似乎都只在大括号之间发布没有搜索字符串的文本

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

blabla
blabla {
  blabla
}
blabla
blabla {
  blabla
  blablaeventblabla
}
blabla
blabla {
  blabla
  blablaeventblabla
}
绝大多数括号内的条目不包含搜索字符串,即“事件”

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

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

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

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

我想这真的很容易,因为这是一项普通的任务。我错过了什么

这个gnu awk应该可以工作:

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

RS='[^\n]*{\n}
将输入记录分隔符设置为后跟
{
}
的任何文本
RT
是一个内部awk变量,它根据
RS
regex设置为匹配的文本。

用户999999999999999999999999999使用
sed得到了一个很好的答案,我非常喜欢,不幸的是,他们的答案由于某种原因消失了

这是给那些可能感兴趣的人的:

sed'/{/{:1;/}/!{N;b1};/event/p};d'文件路径

说明:

/{/如果当前行包含
{
则执行下一个块
{起始块
:1;要跳转到的代码的标签
/}/!如果行不包含
}
,则执行下一个块
{起始块
N、 将下一行添加到图案空间
b1跳转到标签1
};端块
/事件/p如果模式空间包含搜索字符串,请打印它
(此时,图案空间包含完整的线条块
从
{
}
)
};                      端块
d删除模式空间

这里是这个gem的一个修改版本,来自“leu”(10倍leu,用于启蒙美国)。这个人做的事情非常相似。提取以“DEC::PKCS7[”开头,以“]”结尾的所有内容:

cat file | sed '/^DEC::PKCS7\[/{s///; :1; /\]\!$/!{N; b1;}; s///;};'
Explanation:
/^DEC::PKCS7\[/             # if current line begins with 'DEC::PKCS7[' then execute next block
{                           # start block
    s///;                       # remove all upto 'DEC::PKCS7['
    :1;                         # label '1' for code to jump to
    /\]\!$/!                     # if the line does not end with ']!' then execute next block
    {                               # start block
        N;                          # add next line to pattern space
        b1;                         # jump to label 1
    };                          # end block
    s///;                       # remove all from ']!' to end of line
};                          # end block
注:

  • 这适用于单线和多线
  • 如果您有“]”,则会出现意外行为在中间 输入
  • 这并不能回答问题。答案已经很好了。 我的意图只是帮助其他案件

使用此选项的任何人都请注意,如果文件格式不正确(如嵌套的大括号块或缺少匹配的大括号),结果可能会出乎意料。只要匹配的大括号不在同一行上,此选项就可以正常工作。另一个答案也处理这种情况(来自用户999999..9的答案消失了)。我明白了,如果我想理解这个答案,我还得读很多关于awk的书。也许今晚。请参阅更新的答案,以允许
{
}
在同一行中。谢谢anubhava,效果很好!接受作为回答。当然,对于格式错误的文件(如嵌套的大括号块或缺少匹配的大括号),这个答案与另一个答案具有相同的警告。