用户定义正则表达式模式匹配,如何?

时间:2013-04-05 19:12:19

标签: regex shell sed awk

我有一个复杂的文件,其内容为:

Original File

AAA
{      
  "(BBB|KKK)"
  {
    B_1 abc;
    B_2 bcd;
    B_3 efg;
    B_4 xyz;
  }

  CCC
  {
    C_1 cbc;
    C_2 dcd;
  }
}

DDD
{

  EEE
  {
    E_1 ebc;
    E_2 fcd;
  }

  "(FFF|LLL|MMM|NNN)"
  {
    F_1 gbc;
    F_2 hcd;
  }
}

GGG
{
  G_1 ibc;
}

HHH
{
  III
  {
    JJJ
    {
      J_1 jbc;
      J_2 kbc;
    }
  }
}

我想使用awk或一些工具来获取输出(只是举个例子)

F_1 = gbc
G_1 = ibc
J_1 = jbc

我的问题是:如何定义正则表达式模式以便匹配,首先,搜索关键字FFF,然后输出最接近的手镯{和{{1}之间的内容}}?

}

然后可以使用F_1 gbc; F_2 hcd; 进一步管理此内容,我可以获得项grep的值gbc

任何人都知道怎么做?

2 个答案:

答案 0 :(得分:1)

这是一个仅适用于二级嵌套组数据的脚本:

$ awk -v var="FFF" '$1=="}"{p=0}p{sub(/^ */,"");print};$1==var{p=1;getline}' file
F_1 gbc;
F_2 hcd;

答案 1 :(得分:1)

这将允许您“定义正则表达式模式以便匹配,首先,说搜索关键字FFF,然后输出最接近的手镯{和}之间的内容”:

$ gawk -v RS='\0' '{ print gensub(/.*\yFFF\y[^{]+{[[:space:]]*\n([^}]+)\n[[:space:]]*}.*/,"\\1","") }' file
    F_1 gbc;
    F_2 hcd;

不要将输出传递给grep。无论您想要什么,都可以在单个awk调用中轻松完成。