Символы ASCII - это символы в диапазоне от 0 до 177 (восьмеричные) включительно .
Чтобы удалить символы вне этого диапазона в файле, используйте
LC_ALL=C tr -dc '\0-\177' <file >newfile
Команда tr
- это утилита, которая работает с отдельными символами , либо заменяя их другими отдельными символами (транслитерация), удаляя их, либо сжимая серии одного и того же символа в один символ.
Команда выше будет читать file
и записывать измененный контент в newfile
. -d
Опция tr
делает утилиту удаления символов (вместо транслитерации их), и -c
делает его рассматривать символы вне заданного интервала (вместо внутреннего).
LC_ALL=C
гарантирует, что каждое значение байта составляет допустимый символ. Без этого некоторые tr
реализации прервались бы, если бы они нашли последовательности байтов, которые не формируют допустимые символы в кодировке символов локали.
Чтобы заменить исходный файл на измененный, используйте
LC_ALL=C tr -dc '\0-\177' <file >newfile &&
mv newfile file
Это переименовывает новый файл в имя старого файла после tr
успешного завершения. Если tr
не завершится успешно, либо из-за невозможности прочитать исходный файл, либо не записать в новый файл, исходный файл останется без изменений.
В качестве альтернативы, чтобы сохранить как можно больше метаданных (разрешений и т. Д.) Исходного файла, используйте
cp file tmpfile &&
LC_ALL=C tr -dc '\0-\177' <tmpfile >file &&
rm tmpfile