내 파일에 올바른 수의 괄호가 있는지 알고 싶습니다. 내 파일을 다음과 같이 만들 수 있습니다.
(((()))()(())) ((()))()
sed
대괄호 수가 정확하거나 잘못된 경우 어떻게 이러한 대괄호를 계산하고 줄 대신 예 또는 아니요를 인쇄할 수 있습니까?
답변1
sed ' s/.*/YES(&)/;:t
s/([^()]*)//g;tt
s/.....*/NO/'
답변2
테스트 목적으로만 사용
sed ':1;s/([^()]*)//g;t1;s/.*[()].*/No/;t;s/.*/Yes/'
각 줄은 올바른 숫자에 대해 "yes"를 인쇄하고 반대 숫자에 대해 "no"를 인쇄합니다.
답변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