我有大量的文件,其中包含大括号匹配的行。 我不在乎括号是否匹配。
我想检查是否有任何大括号嵌套,通过检查哪一个首先在左括号后面 – 一个closures或另一个开放括号。 我假设所有的括号都是匹配的,每行至多有一个外括号。 (即, [foo[bar]]
是一个有效的行, [foo][bar]
不是,因为第二对括号没有嵌套)。
我可以使用's/.*\[\([^]]*\)\].*/\1/g'
从这个问题中得到括号内的所有内容,但是我不确定如何重新testing抓住了string进一步匹配。
例如,给定以下string:
foo [ bar, [baz] ]
我想我会采取的步骤是:
[
或]
。 如果[
,方括号是嵌套的,所以返回行。 如果]
, 理想情况下,我想要一个基于sed
或unix工具的解决scheme,但其他人可以接受(例如perl
)。 任何帮助,将不胜感激。
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] ] >
使用递归正则表达式来检查括号匹配,并且它们是嵌套的。 检查嵌套而没有语法检查是没有意义的,这可以打破检查结果。 例如:
my $regex = qr/\[([^\[\]]+?|(??{$regex}))*\]/; if( $line =~ /^[^\[\]]*\[$regex\][^\[\]]*$/ ) #Valid