Как я могу удалить U+200B (Пространство Нулевой ширины) использующий sed

У меня есть очень большой файл, которому рассеяли пробелы нулевой ширины повсюду. Занимает слишком много времени открывать и редактировать использование vi таким образом, я хотел бы удалить все экземпляры символьного использования sed. Проблема, я не могу выяснить, как соответствовать символу! Я попытался использовать \u200B, \x{200b}. Какие-либо идеи?

Я выполняю CentOS 5, если это помогает вообще.

15
задан 04.11.2010, 22:33

3 ответа

Это, кажется, работает на меня:

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
11
ответ дан 07.12.2019, 11:08

Поведение sed's GNU с UTF-8, кажется, не очень четко определено. Экспериментально, можно заставить его заменить байты представления UTF-8:

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

С другой стороны, можно ввести символ в оболочку и использовать любую из стандартных команд в локали UTF-8:

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

В zsh можно также ввести символ через escape-последовательность:

<old tr -d $'\u200B' >new
4
ответ дан 07.12.2019, 11:08

Ну, если у любого нет идей для того, как добраться 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
ответ дан 07.12.2019, 11:08

Теги

Похожие вопросы