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

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

  • Определите, какие строки в файле содержат нулевые символы? Я пробовал grepping для \0 и \x0, но это не сработало.

  • Удалить нулевые символы? Запуск strings в файле очистил его, но мне просто интересно, если это лучший способ?

Ответ 1

Id использует tr:

tr < file-with-nulls -d '\000' > file-without-nulls

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

perl -ne '/\000/ and print;' file-with-nulls

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

od file-with-nulls | grep ' 000'

Ответ 5

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

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

Ответ 6

Ниже приведен пример удаления NULL-символов с помощью ex (на месте):

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

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

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

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

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

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

Ответ 7

Я использовал:

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

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