Ответы:
Вы можете попробовать:
%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 выглядит как правильная кодировка символов).