我有以下文件:
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状态,因为以后需要“匹配”来精确定位编辑...
编辑了示例文件
答案 0 :(得分:2)
您几乎没有选择解决问题的方法
使用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
}
}