У меня есть некоторые файлы, которые повреждены с этим символом:
^ @
Это не часть строки; это не для поиска. Как заменить этот символ ничем или как удалить этот символ?
Вот пример строки из одного файла:
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
источник
Я не думаю, что ваши файлы повреждены. Ваша строка примера выглядит так, как будто она содержит обычный текст с нулевыми байтами между каждым символом. Это говорит о том, что это текстовый файл, который был закодирован в UTF-16, но в начале файла отсутствует метка порядка байтов. Смотрите http://en.wikipedia.org/wiki/Byte-order_mark
Предположим, я открываю Блокнот, набираю слово «имя файла» и сохраняю как Unicode Big-endian. Шестнадцатеричный дамп этого файла выглядит так:
Если я открываю этот файл в Vim, он выглядит нормально - байты 'fe ff' сообщают Vim, как файл закодирован. Теперь предположим, что я создаю файл, содержащий точно такую же последовательность байтов, но без начального 'fe ff'. Vim вставляет ^ @ (или <00>, в зависимости от вашей конфигурации) вместо нулевых байтов; Блокнот вставляет пробелы.
Поэтому вместо того, чтобы удалять нули, вам действительно нужно, чтобы Vim правильно интерпретировал файл. Вы можете заставить Vim перезагрузить файл с правильной кодировкой с помощью команды:
источник
Это на самом деле работает для меня в VIM:
источник
<Ctrl-V><Ctrl-2>
(так же как тот с<Ctrl-Shift-2>
) работать, но это работало.Этот символ представляет собой символ NULL со значением ASCII 000.
С vim удалить сложно, попробуйте
источник
Как уже отмечали другие, это нулевые байты (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. Попытка установить сброс формата файла перед указанием кодировки меня огорчила. Вот полный список команд, которые я использовал:источник
Принятое решение не сработало для меня. Я сделал VIM трубу через файл
tr
:Это также будет хорошо работать с визуальным режимом (просто печатать
:!tr -d '\000'
) или рядом строк:источник
^@
Неплохой символ, если вы используете правильную кодировку, но если вы хотите удалить, попробуйте:tr -d '\000'
sed 's/\000//g'
Чтобы преобразовать файл в формат 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 выглядит как правильная кодировка символов).
источник