{中括弧の間にある文字}を削除して中括弧を維持するには?

{中括弧の間にある文字}を削除して中括弧を維持するには?

たとえば、括弧の間のスペースのみを削除すると、この投稿のタイトルは次のようになります。

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

関連情報