Попытка удалить непечатаемые символы (ненужные значения) из файла UNIX

Я пытаюсь удалить непечатаемый символ (например, ^@) из записей в моем файле. Поскольку объем записей в файле слишком велик, использование cat не подходит, так как цикл занимает слишком много времени. я пытался использовать

sed -i 's/[^@a-zA-Z 0-9`~!@#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILENAME

но все же символы ^@ не удаляются. Также я пытался использовать

awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print } FILENAME > NEW FILE 

но тоже не помогло.

Кто-нибудь может предложить альтернативный способ удаления непечатаемых символов?

Используется tr -cd, но он удаляет символы с диакритическими знаками. Но они необходимы в файле.


person Pranav    schedule 22.12.2015    source источник
comment
какой язык используется (параметр unix)?   -  person NeronLeVelu    schedule 22.12.2015
comment
создали обычный скрипт /bin/sh в unix-окне. Этот скрипт будет работать с файлом с 25 миллионами записей, а также получать данные из базы данных. Однако записи, имеющие нежелательное значение, игнорируются этим скриптом.   -  person Pranav    schedule 22.12.2015
comment
Если вы видите много символов NULL (0x00, \0000), это может быть какая-то многобайтовая кодировка. Если это так, это не мусорные символы. Самый простой известный мне способ проверки — это загрузить файл или его часть в emacs.   -  person Erik Bennett    schedule 24.12.2015
comment
Ой. Я только что нашел это. Я знаю, что это будет быстрее, чем emacs. Проверить, содержит ли файл многобайтовый символ   -  person Erik Bennett    schedule 24.12.2015


Ответы (3)


Возможно, вы могли бы использовать дополнение [:print:], которое содержит все печатные символы:

tr -cd '[:print:]' < file > newfile

Если ваша версия tr не поддерживает многобайтовые символы (кажется, что многие из них не поддерживают), это работает для меня с GNU sed (с настройками локали UTF-8):

sed 's/[^[:print:]]//g' file
person Tom Fenech    schedule 22.12.2015

Сначала удалите все управляющие символы:

tr -dc '\007-\011\012-\015\040-\376' < file > newfile

Затем попробуйте свою строку:

sed -i 's/[^@a-zA-Z 0-9`~!@#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' newfile

Я считаю, что то, что вы видите ^@, на самом деле является нулевым значением \0.
Фильтр tr, указанный выше, также удалит их.

person Community    schedule 22.12.2015

strings -1 file... > outputfile

кажется работает

person derek    schedule 05.11.2019
comment
Этот ответ очень короткий и не содержит минимум пояснений, поэтому он кандидат на удаление. Пожалуйста, попробуйте добавить еще несколько объяснений о команде, которую вы предлагаете. - person linuxfan says Reinstate Monica; 06.11.2019