我想知道我的文件中是否有正确数量的括号。我可以让我的文件看起来像
(((()))()(())) ((()))()
sed
如果括号的数量正确或不正确,我该如何计算这些括号并打印是或否而不是行?
答案1
sed ' s/.*/YES(&)/;:t
s/([^()]*)//g;tt
s/.....*/NO/'
答案2
仅用于测试目的
sed ':1;s/([^()]*)//g;t1;s/.*[()].*/No/;t;s/.*/Yes/'
每行打印“是”表示正确的数字,“否”表示相反的数字。
答案3
简单的 Perl 解决方案:
perl -ne '1 while s/\(\)//g; print /[()]/ ? "Invalid\n" : "OK\n"' input.txt
说明: while 循环将删除,()
直到不再可能为止。如果还有括号,则说明它们不平衡。
答案4
下面是做更复杂的工作:标记第一个不匹配的括号:
#!/usr/bin/perl
use strict;
undef $/;
$_= <>; # slurp input
my $P = qr{[^()]*}; # $P = not parentheses
# repace matched parentheses by marks
while(s! \( ($P) \) !\cA$1\cB!gx){}
while(s!^ ($P) \( (.*) \) ($P) $ !$1\cB$2\cB$3!sgx){}
s!([()])! → $1!; # mark the first unmatched ()
y!\cA\cB!()!; # replace marks
print
用法:
$ cat f
1(2(3(4(5)6)7)8(9)10(
11(12)13)14) (15 ( and )
(16(17(18)19)
20)21(22)23
$ parentesis f
1(2(3(4(5)6)7)8(9)10(
11(12)13)14) → (15 ( and )
(16(17(18)19)
20)21(22)23