У меня есть текстовый файл, содержащий нежелательные нулевые символы (ASCII NUL, \0
). Когда я пытаюсь просмотреть это, vi
я вижу ^@
символы, чередующиеся в обычном тексте. Как я могу:
Определите, какие строки в файле содержат нулевые символы? Я пробовал использовать grepping для
\0
и\x0
, но это не сработало.Удалить нулевые символы? Запуск
strings
файла очистил его, но мне просто интересно, лучший ли это способ?
unix
shell
null
special-characters
кендырь
источник
источник
Ответы:
Я бы использовал
tr
:tr < file-with-nulls -d '\000' > file-without-nulls
Если вам интересно, работает ли перенаправление ввода в середине аргументов команды, то да. Большинство снарядов будет распознавать и бороться с Перенаправление ввода / вывода (
<
,>
, ...) где - нибудь в командной строке, на самом деле.источник
tr -d '\000' < file-with-nulls > file-without-nulls
поскольку<
это часть функциональности оболочки оболочки, а неtr
.cat |
. Прекрасное, чистое решение, и оно решило мою проблему.Используйте следующую команду sed для удаления нулевых символов в файле.
sed -i 's/\x0//g' null.txt
это решение редактирует файл на месте, что важно, если файл все еще используется. передача -i'ext 'создает резервную копию исходного файла с добавленным суффиксом' ext '.
источник
sed -i
требуется расширение, но оно может быть пустым. В этих системах, добавить''
, как:sed -i '' 's/\x0//g "$FILE"
.tr
у меня$ sed --version
->sed (GNU sed) 4.7
, мне пришлось использовать следующий вызов, чтобы получить файл резервной копии с именемexample.csv.bak
:sed -i.bak 's/\x0//g' example.csv
Большое количество нежелательных символов NUL, скажем, по одному через каждый байт, указывает на то, что файл закодирован в UTF-16 и что вы должны использовать его
iconv
для преобразования в UTF-8.источник
iconv -f UTF-16 -t UTF-8 file
.Я обнаружил следующее, которое выводит, какие строки, если таковые имеются, имеют нулевые символы:
perl -ne '/\000/ and print;' file-with-nulls
Кроме того, восьмеричный дамп может сказать вам, есть ли нули:
od file-with-nulls | grep ' 000'
источник
Если строки в файле заканчиваются на \ r \ n \ 000, то работает удаление \ n \ 000, а затем замена \ r на \ n.
tr -d '\n\000' <infile | tr '\r' '\n' >outfile
источник
Вот пример того, как удалить символы NULL с помощью
ex
(на месте):ex -s +"%s/\%x00//g" -cwq nulls.txt
и для нескольких файлов:
ex -s +'bufdo!%s/\%x00//g' -cxa *.txt
Для рекурсивности вы можете использовать опцию подстановки
**/*.txt
(если она поддерживается вашей оболочкой).Полезно для написания сценариев, так как
sed
его-i
параметр является нестандартным расширением BSD.См. Также: Как проверить, является ли файл двоичным файлом, и прочитать все файлы, которых нет?
источник
Я использовал:
чтобы избавиться от нулей в файле.
источник
Я столкнулся с той же ошибкой:
import codecs as cd f=cd.open(filePath,'r','ISO-8859-1')
Я решил проблему, изменив кодировку на
utf-16
f=cd.open(filePath,'r','utf-16')
источник