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

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

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

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

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

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

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

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

4 ответа

Решение

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

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

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

sed 's/[^[:print:]]//g' file

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

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

Тогда попробуйте свою строку:

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

Я верю, что то, что вы видите ^@ на самом деле это нулевое значение \0,
tr фильтр сверху удалит и их.

Некоторое время искал это и нашел довольно простое решение:

Пакет ansifilterделает именно это. Все, что вам нужно сделать, это просто пропустить через него вывод.

На Mac:

brew install ansifilter

Потом:

cat file.txt | ansifilter

strings -1 file... > outputfile

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

Другие вопросы по тегам