使用 sed 处理括号

使用 sed 处理括号

我想知道我的文件中是否有正确数量的括号。我可以让我的文件看起来像

(((()))()(())) ((()))()

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

相关内容