Идентификация и удаление нулевых символов в UNIX


у меня есть текстовый файл, содержащий нежелательные нулевые символы (ASCII NUL,). Когда я пытаюсь просмотреть его в vi Я вижу ^@ символы, чередующиеся в обычном тексте. Как я могу:

  1. определите, какие строки в файле содержат нулевые символы? Я пробовал применение grep к-за и x0, но это не работало.

  2. удалить нулевые символы? Работает strings в файле очистил его, но мне просто интересно, является ли это лучшим путь?

8 68

8 ответов:

Я хотел бы использовать tr:

tr < file-with-nulls -d '0' > file-without-nulls

если вам интересно, работает ли перенаправление ввода в середине аргументов команды, это так. Большинство оболочек распознает и обрабатывает перенаправление ввода-вывода (<,>,...) в любом месте командной строки, на самом деле.

используйте следующую команду sed для удаления нулевых символов в файл.

sed -i 's/\x0//g' null.txt

это решение редактирует файл на месте, важно, если файл все еще используется. передача-I'ext 'создает резервную копию исходного файла с добавлением суффикса 'ext'.

большое количество нежелательных символов NUL, скажем, каждый второй байт, указывает на то, что файл закодирован в UTF-16 и что вы должны использовать iconv преобразовать в UTF-8.

я обнаружил следующее, которое выводит, какие строки, если таковые имеются, имеют нулевые символы:

perl -ne '/0/ and print;' file-with-nulls

кроме того, восьмеричный дамп может сказать вам, есть ли нули:

od file-with-nulls | grep ' 000'

Если строки в файле заканчиваются на \r\n\000, то что работает, так это удалить \n\000, а затем заменить \r на \n.

tr -d '\n0' <infile | tr '\r' '\n' >outfile

вот пример, как удалить нулевые символы с помощью ex (на месте):

ex -s +"%s/\%x00//g" -cwq nulls.txt

и для нескольких файлов:

ex -s +'bufdo!%s/\%x00//g' -cxa *.txt

для рекурсивности, вы можете использовать подстановка параметра**/*.txt (если он поддерживается вашим оболочки).

полезно для сценариев, так как sed и -i параметр является нестандартным расширением BSD.

Читайте также: Как проверить, является ли файл двоичным файлом и прочитать все файлы, которые не являются?

Я:

recode UTF-16..UTF-8 <filename>

чтобы избавиться от нулей в файл.

я столкнулся с той же ошибкой:

import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')

я решил проблему, изменив кодировку на utf-16

f=cd.open(filePath,'r','utf-16')