Идентификация и удаление пустых символов в 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>
чтобы избавиться от нулей в файле.