14

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

Я использую CentOS 5, если это поможет.

3 ответа3

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
4

Поведение 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 вы также можете ввести символ через escape-последовательность:

<old tr -d $'\u200B' >new
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()

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .