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


15

我有一个很大的文件,整个文件零散。使用打开和编辑它花费的时间太长,vi因此我想使用删除该字符的所有实例sed。问题是,我不知道如何匹配角色!我已经尝试使用\u200B\x{200b}。有任何想法吗?

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


您的sed副本是否支持文件编码所使用的Unicode编码?如果不是,可能没有很好的方法来正确地使用sed,而您最好使用python脚本之类的东西……
JanC

@JanC-确实,我已经使用了Python。该文件使用utf8编码,似乎足够标准,以至于任何东西都可以对其进行处理。我在下面添加了我的python脚本,以防它对任何人有用。
thetaiko

Answers:


11

这似乎为我工作:

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|

编辑:

部分基于吉尔斯的答案:

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

完美-这正是我想要的。实际上,\xe2\x80\x8b在Python中查看一些示例字符串时,我注意到相同的一组字符()。谢谢!
thetaiko

4

GNU sed对UTF-8的行为似乎没有很好的定义。实验上,您可以使其替换UTF-8表示形式的字节:

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

另外,您可以在外壳程序中键入字符,并在UTF-8语言环境中使用任何标准命令:

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

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

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

由于击4.2,Unicode的序列被支持echo -eprintf格式字符串和ANSI引用的字符串(例如echo -e '\u1E4F'printf '\u01DD %s\n' 'X'mkdir $'\u0250
暂停,直到进一步的通知。

0

好吧,除非有人对如何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()

2
如果您打算大手笔,那么简单得多perl -C -pe 's/\x{200B}//g'呢?
吉尔(Gilles)'所以

+1也可以在Mac OSX上使用的Gilles。perl -C -pi.bak -e 's/\x{200B}//g' yourfile导致yourfile修复,yourfile.bak备份
MarkHu 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.