如何删除{仅在大括号之间找到}的字符,并随身携带括号?

如何删除{仅在大括号之间找到}的字符,并随身携带括号?

例如,如果我仅删除括号之间的空格,则这篇文章的标题将是:

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

相关内容