幅ゼロのスペースが散在している非常に大きなファイルがあります。 vi
を使用して開いて編集するには時間がかかりすぎるため、sed
を使用してキャラクターのすべてのインスタンスを削除したいと思います。問題は、キャラクターのマッチング方法がわからないことです! \u200B
、\x{200b}
を使ってみました。何か案は?
それが役に立ったら、私はCentOS5を実行しています。
これは私にとってはうまくいくようです:
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()