Попытка удалить непечатаемые символы (ненужные значения) из файла 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