我有一个非常大的文件,其中到处都是零宽度空格。使用 打开和编辑需要很长时间,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()