web-dev-qa-db-ja.com

sedを使用してU + 200B(ゼロ幅スペース)を削除する方法

幅ゼロのスペースが散在している非常に大きなファイルがあります。 viを使用して開いて編集するには時間がかかりすぎるため、sedを使用してキャラクターのすべてのインスタンスを削除したいと思います。問題は、キャラクターのマッチング方法がわからないことです! \u200B\x{200b}を使ってみました。何か案は?

それが役に立ったら、私はCentOS5を実行しています。

15
thetaiko

これは私にとってはうまくいくようです:

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

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

まあ、誰かが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()
0
thetaiko