다음과 같은 텍스트가 있습니다.
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