У меня есть очень большой файл, которому рассеяли пробелы нулевой ширины повсюду. Занимает слишком много времени открывать и редактировать использование vi
таким образом, я хотел бы удалить все экземпляры символьного использования sed
. Проблема, я не могу выяснить, как соответствовать символу! Я попытался использовать \u200B
, \x{200b}
. Какие-либо идеи?
Я выполняю CentOS 5, если это помогает вообще.
Это, кажется, работает на меня:
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
Поведение 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
Ну, если у любого нет идей для того, как добраться 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()