0

我得到了一个复杂的文件,其内容如下:

原始文件

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之间的内容?{}

F_1 gbc;
F_2 hcd;

然后可以进一步传输这些内容,并使用grep我可以获得gbcitem的值F_1

有谁知道该怎么做?

4

2 回答 2

1

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

$ awk -v var="FFF" '$1=="}"{p=0}p{sub(/^ */,"");print};$1==var{p=1;getline}' file
F_1 gbc;
F_2 hcd;
于 2013-04-05T19:29:37.047 回答
1

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

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

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

于 2013-04-05T22:16:57.093 回答