{중괄호 사이에만 있는 문자}를 제거하고 중괄호를 유지하는 방법은 무엇입니까?

{중괄호 사이에만 있는 문자}를 제거하고 중괄호를 유지하는 방법은 무엇입니까?

예를 들어, 괄호 사이의 공백만 제거하면 이 게시물의 제목은 다음과 같습니다.

How can I remove a character onlyfoundbetweenbrackets, and take the brackets along for the ride?

여기서는 대괄호를 제자리에 유지하는 예만 보았습니다.

편집하다:공백을 제거할 필요는 없습니다. 제거해야 합니다.N특징.

이것은 지금까지 내 코드입니다.Ns, 하지만 안타깝게도 이렇게 하면 불쾌한 중괄호가 남게 됩니다.

sed -i "" -e :1 -e 's/\({[^}]*\)[ñ]/\1/g;t1' file
_________________________________________________
ñañañañañañañaña{ñañañañañañañaña}batmañañañañañañañaña{ñañañañañañañaña}batmañ

getting:
ñañañañañañañaña{aaaaaaaa}batmañañañañañañañaña{ñañañañañañañaña}batmañ

but wishing for:
ñañañañañañañañaaaaaaaaabatmañañañañañañañaña{ñañañañañañañaña}batmañ

FreeBSD/MacOS에서는 gawk나 GNU sed를 사용할 수 없습니다.

답변1

의 경우 perl문자가 ñUTF-8로 인코딩되어 해당 문자의 사전 조립 및 분해 버전을 처리한다고 가정합니다.

perl -C -pi -e '
  BEGIN {
    $c = qr{\N{LATIN SMALL LETTER N WITH TILDE}|n\N{COMBINING TILDE}}
  }
  s<\{([^}]*$c[^}]*)\}><$1 =~ s/$c//gr>ge' -- your-file

(중첩이 없다고 가정 {...}).

답변2

모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.

$ awk '{
    while ( match($0,/\{[^}]+}/) ) {
        tgt = substr($0,RSTART+1,RLENGTH-2)
        gsub(/ñ/,"",tgt)
        $0 = substr($0,1,RSTART-1) tgt substr($0,RSTART+RLENGTH)
    }
    print
}' file
ñañañañañañañañaaaaaaaaabatmañañañañañañañañaaaaaaaaabatmañ

위의 내용에서는 중첩된 괄호가 없다고 가정합니다.

답변3

gawk/mawk/mawk2/nawk에서 작동하는 것으로 확인되었으며 UTF8 또는 POSIX/C 로케일에서도 잘 작동합니다.

라이트:

 gawk/mawk/nawk 'BEGIN {
       __=index(FS="[{"(OFS="")"}]","{") 
     } __<=(NF=NF) {        _=!__
  do { gsub("\303\261","",$(_+=__)) } while(_<NF) }__' 

확장하다:

ñañañañañañañañaaaaaaaaabatmañañañañañañañañaaaaaaaaabatmañ

# gawk profile, created Thu Mar 17 08:27:40 2022

# BEGIN rule(s)

BEGIN {
 1      __ = index(FS = "[{" (OFS = "") "}]", "{")
}

# Rule(s)

 1  __ <= (NF = NF) { # 1
 1      _ = ! __
 3      do {
 3          gsub("\303\261", "", $(_ += __))
    } while (_ < NF)
}

 1  __ { # 1
 1      print
}
  • 작은 버그가 발견되어 수정되었습니다.NF=NF

관련 정보