Ответы:
Вы можете попробовать:
%s/<CTRL-2>//g
(на обычных ПК)
%s/<CTRL-SHIFT-2>//g
(на компьютерах Mac)
где <CTRL-2>
означает сначала нажать CTRLна обычные ПК, удерживая его нажатым, ударить 2, отпустить CTRL.
и <CTRL-SHIFT-2>
означает сначала нажать controlна ПК Mac, удерживая его нажатым, нажать shiftна ПК Mac, удерживая его нажатым, нажать 2, отпустить controlи shift.
Наконец, обе команды должны появиться %s/^@//g
на экране. ^@
означает один символ (байт NULL, который иначе не может быть отображен), ^
за которым не следует @
, поэтому вы не можете просто набрать ^
и @
в строке в приведенной выше команде.
Эта команда удаляет все ^@
.
Я не думаю, что ваши файлы повреждены. Ваша строка примера выглядит так, как будто она содержит обычный текст с нулевыми байтами между каждым символом. Это говорит о том, что это текстовый файл, который был закодирован в UTF-16, но в начале файла отсутствует метка порядка байтов. Смотрите http://en.wikipedia.org/wiki/Byte-order_mark
Предположим, я открываю Блокнот, набираю слово «имя файла» и сохраняю как Unicode Big-endian. Шестнадцатеричный дамп этого файла выглядит так:
fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65
Если я открываю этот файл в Vim, он выглядит нормально - байты 'fe ff' сообщают Vim, как файл закодирован. Теперь предположим, что я создаю файл, содержащий точно такую же последовательность байтов, но без начального 'fe ff'. Vim вставляет ^ @ (или <00>, в зависимости от вашей конфигурации) вместо нулевых байтов; Блокнот вставляет пробелы.
Поэтому вместо того, чтобы удалять нули, вам действительно нужно, чтобы Vim правильно интерпретировал файл. Вы можете заставить Vim перезагрузить файл с правильной кодировкой с помощью команды:
:e ++enc=utf16
Это на самом деле работает для меня в VIM:
:%s/\%x00//g
<Ctrl-V><Ctrl-2>
(так же как тот с <Ctrl-Shift-2>
) работать, но это работало.
Как уже отмечали другие, это нулевые байты (ASCII 00). В Linux способ ввода значений ASCII в vim состоит в том, чтобы нажать Ctrl-V, а затем восьмеричное восьмизначное значение любого символа. Чтобы заменить все нулевые байты, используйте:
:%s/
Ctrl-V000//g
(без пробелов).
Аналогично, вы можете искать нули с помощью:
/
Ctrl-V000
В обоих случаях он не будет показывать нули при их наборе, но после ввода всех трех он будет отображаться ^@
. На цветных терминалах это будет показано синим цветом, чтобы указать, что это контрольный символ.
FWIW, в моем случае мне пришлось использовать vim на cygwin для редактирования текстового файла, созданного на Mac. Принятое решение не сработало для меня, но было близко. Согласно вики-странице Vim о работе с Unicode , существует разница между версиями байта BOM с Big Endian и Little Endian. Итак, я должен был явно сказать, vim
чтобы использовать версию кодирования спецификации Little Endian.
Только после выбора правильной кодировки я преобразовал формат файла (окончания строк), dos
чтобы я мог редактировать файл в редакторе Windows. Попытка установить сброс формата файла перед указанием кодировки меня огорчила. Вот полный список команд, которые я использовал:
:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
Принятое решение не сработало для меня. Я сделал VIM трубу через файл tr
:
:%!tr -d '\000'
Это также будет хорошо работать с визуальным режимом (просто печатать :!tr -d '\000'
) или рядом строк:
# Remove nulls from current line:
:.!tr -d '\000'
# Remove nulls from lines 3-5:
:3,5!tr -d '\000'
^@
Неплохой символ, если вы используете правильную кодировку, но если вы хотите удалить, попробуйте:
tr -d '\000'
sed 's/\000//g'
Символ ^ M есть в данных вашего примера
Чтобы преобразовать файл в формат Unix / Linux перед любой обработкой, попробуйте:
dos2unix filename
- Рел и другие
dos2ux filename [newfilename]
- HP-UX
В дополнение к ответу @ jrb в Vim определяется кодировка символов файла на основе опции fileencodings. (обратите внимание на 's' в конце кодирования файла)
Т.е. в Windows значением по умолчанию для этой fileencodings
опции является ucs-bom
:
проверьте, существует ли спецификация в начале файла.
Если спецификация существует, тогда «прочитайте кодировку символов файла из спецификации».
Если спецификация не существует (и в этом случае это также будет означать, что все кодировки символов, указанные в fileencodings
параметре, не совпадают), считайте файл с кодировкой символов, указанной в encoding
параметре. Кодировка символов по умолчанию для encoding
опции: latin1
. Теперь, поскольку latin1
это кодировка символов длиной в один байт , все байты в файле являются допустимыми latin1
символами (даже Nul
символ, ^@
который вы видите *).
* - фактически, ^@
это символ новой строки в тексте буфера Vim, а не символ Nul.
Правильный способ чтения файла - указать кодировку символов вручную как UTF-16 (в этом случае UTF-16 выглядит как правильная кодировка символов).