如何使用 sed 删除 U+200B(零宽度空格)

如何使用 sed 删除 U+200B(零宽度空格)

我有一个非常大的文件,其中到处都是零宽度空格。使用 打开和编辑需要很长时间,vi所以我想使用 删除所有字符实例sed。问题是,我不知道如何匹配字符!我试过使用\u200B\x{200b}有什么想法吗?

如果有帮助的话,我正在运行 CentOS 5。

答案1

这似乎对我有用:

sed 's/\xe2\x80\x8b//g' inputfile

示范:

$ /usr/bin/printf 'X\u200bY\u200bZ' | hexdump -C
00000000  58 e2 80 8b 59 e2 80 8b  5a                       |X...Y...Z|
$ /usr/bin/printf 'X\u200bY\u200bZ' | sed 's/\xe2\x80\x8b//g' | hexdump -C
00000000  58 59 5a                                          |XYZ|

编辑:

部分基于 Gilles 的回答:

tr -d $(/usr/bin/printf "\u200b") < inputfile

答案2

GNU sed 对 UTF-8 的行为似乎定义得不是很好。通过实验,您可以让它替换 UTF-8 表示的字节:

<old sed 's/\xe2\x80\e8b//g' >new

或者,您也可以在 shell 中输入字符并使用 UTF-8 语言环境中的任何标准命令:

<old tr -d '​' >new
<old sed 's/​//g' >new

在 zsh 中,也可以通过转义序列输入字符:

<old tr -d $'\u200B' >new

答案3

好吧,除非有人知道如何做到sed这一点(顺便说一句,我仍然对此很感兴趣),否则 Python 可以来救援……

import sys, re
pattern = re.compile(u"\u200b")
f = open(sys.stdin, "rb")
for line in f:
    a = pattern.sub("", line.decode("utf8"))
    print a.encode("utf8"),
f.close()

相关内容