sed는 중괄호 사이의 패턴과 일치합니다.

sed는 중괄호 사이의 패턴과 일치합니다.

이 모델에서

[string 1]{string 2}

string 2사이의 문자열을 추출하고 싶습니다 .마지막성냥중괄호 - 즉, 삭제 [string 1], 열기 {및 닫기 }. 또는에 추가 [쌍이 있으면 ]아래 시도가 실패합니다.string 1string 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}'

이는 다른 일치하는 컬 쌍을 완전히 포함할 수 있는 행에서 일치하는 컬 쌍이 마지막으로 발생하기 전에 모든 것을 제거합니다.

관련 정보