Идентификация и удаление нулевых символов в UNIX
у меня есть текстовый файл, содержащий нежелательные нулевые символы (ASCII NUL,). Когда я пытаюсь просмотреть его в
vi
Я вижу ^@
символы, чередующиеся в обычном тексте. Как я могу:
определите, какие строки в файле содержат нулевые символы? Я пробовал применение grep к-за
и
x0
, но это не работало.удалить нулевые символы? Работает
strings
в файле очистил его, но мне просто интересно, является ли это лучшим путь?
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.Читайте также: Как проверить, является ли файл двоичным файлом и прочитать все файлы, которые не являются?