대괄호가 포함된 텍스트 추출

대괄호가 포함된 텍스트 추출

다음과 같은 텍스트가 있습니다.

Sentence #1 (n tokens):
Blah Blah Blah
[...
 ...
 ...]
( #start first set here
 ... (other possible parens and text here)
 ) #end first set here

(...)
(...)

Sentence #2 (n tokens):

두 번째 대괄호 세트(그 사이의 모든 항목 포함)를 추출하고 싶습니다. 즉,

(
 ... (other possible parens here)
)

이를 수행하는 bash 방법이 있습니까? 간단하게 해보았습니다

 's/(\(.*\))/\1/'

답변1

그게 다야. 더 좋은 방법이 있을 수도 있지만, 제 생각에는 다음과 같은 방법이 가장 먼저 떠오릅니다.

echo 'Sentence #1 (n tokens):
Blah Blah Blah
[...
 ...
 ...]
(
 ... (other possible parens here)
 )

(...)
(...)

Sentence #2 (n tokens):
' | perl -0777 -nE '
    $wanted = 2; 
    $level = 0; 
    $text = ""; 
    for $char (split //) {
        $level++ if $char eq "(";
        $text .= $char if $level > 0;
        if ($char eq ")") {
            if (--$level == 0) {
                if (++$n == $wanted) { 
                    say $text;
                    exit;
                }
                $text="";
            }
        }
    }
'

산출

(
 ... (other possible parens here)
 )

답변2

Glenn의 답변은 훌륭하지만 (대량 입력의 경우 더 빠를 수 있음) 기록에 따르면 Glenn의 제안은 bash에서도 전적으로 가능합니다. 단 몇 분 만에 그의 답변을 순수 bash로 포팅하는 것은 비교적 간단한 문제였습니다.

s='Sentence #1 (n tokens):
Blah Blah Blah
[...
 ...
 ...]
(
 ... (other possible parens here)
 )

(...)
(...)

Sentence #2 (n tokens):
'
wanted=2
level=0
text=""
for (( i=0; i<${#s}; i++ )); do
    char="${s:i:1}"
    if [ "$char" == "(" ]; then (( level++ )) ; fi
    if (( level > 0 )); then text+="$char"; fi
    if [ "$char" == ")" ]; then
        if (( --level == 0 )); then
            if (( ++n == wanted )); then
                echo "$text"
                exit
            fi
            text=""
        fi
    fi
done

관련 정보