sed를 사용하여 괄호 처리

sed를 사용하여 괄호 처리

내 파일에 올바른 수의 괄호가 있는지 알고 싶습니다. 내 파일을 다음과 같이 만들 수 있습니다.

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

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

관련 정보