我有大量文件,其中包含匹配大括号的行。如果括号匹配与否,我不小心。
我想检查是否有任何大括号嵌套,通过检查哪个大括号是在开始括号之后 - 关闭或另一个开括号。我假设所有括号都匹配,并且每行最多有一个外括号。 (即,[foo[bar]]
是有效行,[foo][bar]
不是,因为第二个括号对不是嵌套的。)
我可以使用's/.*\[\([^]]*\)\].*/\1/g'
从this question获取括号对中的所有内容,但我不确定如何重新测试抓取的字符串以进行进一步的匹配。
例如,给定以下字符串:
foo [ bar, [baz] ]
我认为我会采取的步骤是:
[
或]
。如果[
,括号嵌套,则返回该行。如果]
,理想情况下,我想要基于sed
或基于unix工具的解决方案,但其他解决方案是可接受的(例如perl
)。任何帮助,将不胜感激。
答案 0 :(得分:2)
使用递归正则表达式检查括号匹配并且它们是嵌套的。在没有语法检查的情况下检查嵌套是没有意义的,这可以突破检查结果。例如:
my $regex = qr/\[([^\[\]]+?|(??{$regex}))*\]/;
if( $line =~ /^[^\[\]]*\[$regex\][^\[\]]*$/ ) #Valid
答案 1 :(得分:0)
perl -ne 'print if /\[[^\]]*\[/' your_file
测试如下:
> cat temp
foo [ bar, [baz] ]
foo [ bar, baz ]
foo [ bar ]
foo [ bar, baz] ]
foo bar, [baz] ]
> perl -ne 'print if /\[.*\[/' temp
foo [ bar, [baz] ]
>