Sed kullanarak U + 200B'yi (Sıfır genişlik alanı) nasıl silebilirim


15

Boyunca dağılmış sıfır genişlik boşlukları olan çok büyük bir dosya var. Kullanarak açmak ve düzenlemek çok uzun sürüyor, vibu yüzden kullanarak karakterin tüm örneklerini silmek istiyorum sed. Sorun şu ki, karakteri nasıl eşleştireceğim! Ben kullanarak denedim \u200B, \x{200b}. Herhangi bir fikir?

Eğer yardımcı olursa CentOS 5 kullanıyorum.


Sed kopyanız dosyanın kodlandığı Unicode kodlamasını destekliyor mu? Değilse muhtemelen sed ile düzgün bir şekilde yapmanın iyi bir yolu yoksa ve bir python betiği veya bunun gibi bir şey kullanmanız iyi olur ...
JanC

@JanC - gerçekten, Python ile gittim. Dosya utf8 ile kodlanmıştır, herhangi bir şeyin işleyebileceği kadar standart görünüyor. Herkes için yararlı olması durumunda python betiğimi aşağıya ekledim.
thetaiko

Yanıtlar:


11

Bu benim için işe yarıyor gibi görünüyor:

sed 's/\xe2\x80\x8b//g' inputfile

gösteri:

$ /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|

Düzenle:

Kısmen Gilles'in cevabına dayanarak:

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

Mükemmel - tam da aradığım şey buydu. Aslında, \xe2\x80\x8bPython bazı örnek dizeleri bakarken aynı karakter kümesi ( ) fark ettim . Teşekkür ederim!
thetaiko

4

GNU sed'in UTF-8 ile olan davranışı çok iyi tanımlanmış gibi görünmüyor. Deneysel olarak, UTF-8 temsilinin baytlarının yerini alabilir:

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

Alternatif olarak, karakteri kabuğunuza yazabilir ve UTF-8 yerel ayarındaki standart komutlardan herhangi birini kullanabilirsiniz:

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

Zsh'de, karakteri bir kaçış dizisi aracılığıyla da girebilirsiniz:

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

Bash 4.2 itibariyle Unicode dizileri tarafından desteklenen echo -e, printfbiçim dizeleri ve ANSI dizeleri alıntı (örneğin echo -e '\u1E4F', printf '\u01DD %s\n' 'X', mkdir $'\u0250)
Duraklatıldı sonraki duyuruya kadar.

0

Peki, kimsenin bunu nasıl yapacağına dair bir fikri sedyoksa (ki bu arada hala ilgileniyorum) Python'u kurtarmaya ...

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
Eğer büyük silahlara ulaşacaksanız, daha basit olana ne dersiniz perl -C -pe 's/\x{200B}//g'?
Gilles 'SO- kötü olmayı bırak'

Mac OSX'te de çalışan Gilles'e +1. perl -C -pi.bak -e 's/\x{200B}//g' yourfile
dosyanız
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.