이 모델에서
[string 1]{string 2}
string 2
사이의 문자열을 추출하고 싶습니다 .마지막쌍성냥중괄호 - 즉, 삭제 [string 1]
, 열기 {
및 닫기 }
. 또는에 추가 [
쌍이 있으면 ]
아래 시도가 실패합니다.string 1
string 2
원하는 출력:
아래 스크립트의 원하는 출력은 다음으로 시작 foo
하고 끝납니다 digit
.
foo bar 1
foo bar 2
foo[3]{xyz} bar 3
foo $sq[3]{xyz}$ bar 4
foo $sq[3]{xyz}$ bar 5
foo $sq[3]{xyz}$ bar 6
foo $sq[3]{xyz}$ bar 7
foo $sq[3]{xyz}$ bar 8'
foo $sq[abc]{xyz}$ bar 9'
foo $sq[abc]{xyz}$ bar 10'
가정:
- 매개변수는 다음과 같습니다.
RemoveInitialSquareBraces
언제나로 시작[
하고 로 끝납니다}
. - 개막식
[
은string 1
~ 할 것이다의]
시작 부분에 일치 항목이 있습니다 .{
string 2
플랫폼:
- 애플 시스템 10.9.5
스크립트
#!/bin/bash
function RemoveInitialSquareBraces {
#EXTRACTED_TEXT="$(\
# echo "$1" \
# | sed 's/^\[.*\]//' \
# | sed 's/{//' \
# | sed 's/}$//' \
# )"
EXTRACTED_TEXT="$(\
echo "$1" \
| sed 's/.*[^0-9]\]{\(.*\)}/\1/' \
)"
echo "${EXTRACTED_TEXT}"
}
RemoveInitialSquareBraces '[]{foo bar 1}'
RemoveInitialSquareBraces '[abc]{foo bar 2}'
RemoveInitialSquareBraces '[]{foo[3]{xyz} bar 3}'
RemoveInitialSquareBraces '[]{foo $sq[3]{xyz}$ bar 4}'
RemoveInitialSquareBraces '[goo{w}]{foo $sq[3]{xyz}$ bar 5}'
RemoveInitialSquareBraces '[goo[3]{w}]{foo $sq[3]{xyz}$ bar 6}'
RemoveInitialSquareBraces '[goo[3]{w} hoo[3]{5}]{foo $sq[3]{xyz}$ bar 7}'
RemoveInitialSquareBraces '[goo[3]{w} hoo[3]{5}]{foo $sq[3]{xyz}$ bar 8}'
RemoveInitialSquareBraces '[goo[3]{w} hoo[xyz]{5}]{foo $sq[abc]{xyz}$ bar 9}'
RemoveInitialSquareBraces '[goo[3]{w} hoo[xyz]{uvw}]{foo $sq[abc]{xyz}$ bar 10}'
exit 0
답변1
위 입력 예의 경우 스크립트는 다음과 같습니다.
sed s/[^\"\']*[^0-9]\]{\(.*\)}/\1/ <<\END
"[]{foo bar 1}"
"[abc]{foo bar 2}"
"[]{foo[3]{xyz} bar 3}"
"[]{foo $sq[3]{xyz}$ bar 4}"
"[goo{w}]{foo $sq[3]{xyz}$ bar 5}"
"[goo[3]{w}]{foo $sq[3]{xyz}$ bar 6}"
"[goo[3]{w} hoo[3]{5}]{foo $sq[3]{xyz}$ bar 7}"
END
생산하다
"foo bar 1"
"foo bar 2"
"foo[3]{xyz} bar 3"
"foo $sq[3]{xyz}$ bar 4"
"foo $sq[3]{xyz}$ bar 5"
"foo $sq[3]{xyz}$ bar 6"
"foo $sq[3]{xyz}$ bar 7"
또 다른 점은 기능을 단순화할 수 있다는 것입니다.
function RemoveInitialSquareBraces {
printf '%s\n' "$@" |
sed ...
}
따라서 많은 매개변수를 허용합니다.
고쳐 쓰다: 보다 일반적인 경우에는 다음 두 단계로 작업을 수행할 수 있습니다.
sed -e "
s/\[.*\[.*\][^[]*\]/[]/ #remove square brackets inside square brackets
s/\[[^]]*\]{\(.*\)\}/\1/ #lazy strip square brackets and curle brackets
"
다음에 추가: Perl을 사용할 수 있습니다.grep(펄 확장을 사용한 GNU grep):
grep -Po '\[([^][]*\[\w+\][^][]*)*\]{\K.*(?=})'
또는 동일한 정규식을 사용하여 sed:
sed 's/\[\([^][]*\(\[\w\+\][^][]*\)*\)*\]{\(.*\)}/\3/'
답변2
이것은 귀하의 입력에 적용됩니다.
sed -Ee's/.*(\{[^}]*(\{[^{}]*\}[^{]*)*\})/\1/'
{foo bar 1}'
{foo bar 2}'
{foo[3]{xyz} bar 3}'
{foo $sq[3]{xyz}$ bar 4}'
{foo $sq[3]{xyz}$ bar 5}'
{foo $sq[3]{xyz}$ bar 6}'
{foo $sq[3]{xyz}$ bar 7}'
{foo $sq[3]{xyz}$ bar 8}'
{foo $sq[abc]{xyz}$ bar 9}'
{foo $sq[abc]{xyz}$ bar 10}'
이는 다른 일치하는 컬 쌍을 완전히 포함할 수 있는 행에서 일치하는 컬 쌍이 마지막으로 발생하기 전에 모든 것을 제거합니다.