匹配的冰壶支架之间的sed匹配

时间:2019-11-06 10:38:47

标签: regex sed

我有以下文件:

Items{
 Item{
    car "blue"
    tire 4
  }
 Item{
    car "yellow"
    tire 0
 }
}
Orders{
 Order{
    ID 123
    Cost 123
 }
 Order{
    ID 231
    Cost 2
 }
}

我需要 sed 来匹配项目{和该组中最后匹配的}之间的所有内容...因为现在我可以做到:

sed -n /Items/,/^\}/p

问题是,文件对空间不敏感,子类别的其他方括号也可以位于行的开头...知道如何通用地匹配它吗?它必须处于sed状态,因为以后需要“匹配”来精确定位编辑...

编辑了示例文件

1 个答案:

答案 0 :(得分:2)

您几乎没有选择解决问题的方法

  1. 将文件转换为标准格式(XML,JSON),并使用标准工具(xml,xsltproc或jq)解析文件。
  2. 对文件进行漂亮的打印,然后使用缩进来标识块结尾。
  3. 编写自定义令牌生成器,并计算打开/关闭括号。

使用perl来构建#2,以构建漂亮的打印格式化程序。可以使用任何工具(sed,awk等)提取。

perl pp-data.pl filename.txt | sed -n 'sed -n '/^Items/,/^}/p'
#! /usr/bin/perl
# pp-data.pl
use strict ;
my $d = eval { local $/ ; <> } ;
my $l = 0 ;
my $n = 0 ;
while ( $d =~ /({|}|\w+|"[^"]*")/g ) {
        my $w = $1 ;

        $l-- if $w eq '}' ;

        print $n ? " " : (" " x ($l * 2)), $w ;
        $n++ ;

        if ( $w eq "{" ) {
                $l++ ;
                $n = 0 ;
        } elsif ( $w eq "}" ) {
                $n = 0 ;
        } elsif ( $n == 2 ) {
                $n = 0 ;
        } ;
        print "\n" unless $n ;
} ;
1;

对于答案中的输入,解析后的输出将如下所示:

Items {
  Item {
    car "blue"
    tire 4
  }
  Item {
    car "yellow"
    tire 0
  }
}
Orders {
  Order {
    ID 123
    Cost 123
  }
  Order {
    ID 231
    Cost 2
  }
}