例如,如果我仅删除括号之间的空格,则这篇文章的标题将是:
How can I remove a character onlyfoundbetweenbrackets, and take the brackets along for the ride?
我在这里只看到了将括号保留在适当位置的示例。
编辑:我真的不需要删除空格,我需要删除ñ特点。
这是我到目前为止的代码,它删除了ñs,但遗憾的是留下了讨厌的大括号:
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 机器上的任何 shell 中使用任何 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