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


15

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

CentOS 5を実行している場合は、それがまったく役立つ場合。


sedのコピーは、ファイルがエンコードされるUnicodeエンコードをサポートしていますか?...そこのsedでそれを正しく行うには良い方法はおそらくありません、あなたがより良いPythonスクリプトまたはそのようなものを使用したいない場合
JanC

@JanC-確かに、私はPythonを使いました。ファイルはutf8でエンコードされており、何でも処理できるほど十分に標準的なようです。誰にとっても便利なように、Pythonスクリプトを以下に追加しました。
thetaiko

回答:


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\x8bPythonでサンプル文字列を見ると、同じ文字セット()に気付きました。ありがとうございました!
-thetaiko

4

UTF-8でのGNU sedの動作は、あまり明確に定義されていないようです。実験的に、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

Bash 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'どうですか?
ジル「SO-悪をやめろ」

Mac OSXでも動作するGillesへの+1。 perl -C -pi.bak -e 's/\x{200B}//g' yourfileyourfileが修正され、yourfile.bakにバックアップが作成されます
MarkHu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.