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