Как удалить все символы, не относящиеся к ascii, из одного файла? Будет ли определенная команда для выполнения этого?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
Я считаю, что это находит символы в рабочем процессе, но как бы я удалил все экземпляры рассматриваемых символов?
text-processing
ascii
Мизоле Ни
источник
источник
cat -v
для отображения в репрезентации ASCII для них. (например,^G
для\007
)Ответы:
Символы ASCII - это символы в диапазоне от 0 до 177 (восьмеричные) включительно .
Чтобы удалить символы вне этого диапазона в файле, используйте
Команда
tr
- это утилита, которая работает с отдельными символами , либо заменяя их другими отдельными символами (транслитерация), удаляя их, либо сжимая серии одного и того же символа в один символ.Команда выше будет читать
file
и записывать измененный контент вnewfile
.-d
Опцияtr
делает утилиту удаления символов (вместо транслитерации их), и-c
делает его рассматривать символы вне заданного интервала (вместо внутреннего).LC_ALL=C
гарантирует, что каждое значение байта составляет допустимый символ. Без этого некоторыеtr
реализации прервались бы, если бы они нашли последовательности байтов, которые не формируют допустимые символы в кодировке символов локали.Чтобы заменить исходный файл на измененный, используйте
Это переименовывает новый файл в имя старого файла после
tr
успешного завершения. Еслиtr
не завершится успешно, либо из-за невозможности прочитать исходный файл, либо не записать в новый файл, исходный файл останется без изменений.В качестве альтернативы, чтобы сохранить как можно больше метаданных (разрешений и т. Д.) Исходного файла, используйте
источник
С
perl
источник
Если все, что вам нужно, это регулярное выражение:
[\x00-\x7F]
вы можете обратиться к нескольким утилитам:Поймите, что sed, awk и perl ожидают «текстовые файлы», как определено в Unix. Все хорошо работает в этом случае. Но, в частности, awk добавляет завершающую новую строку (существует ли она в исходном файле или нет) (использование printf удаляет ВСЕ новые строки на входе). Тр предназначен для работы с любым типом файлов. Однако NUL (
\0
) не является допустимым символом в текстовом файле POSIX, и его следует избегать:Фактически, многие управляющие символы могут создавать другие проблемы при определенных условиях.
Так что, вероятно, вам нужно
[\x07-\x0d\x20-\x7e]
Диапазон 7-13 (в десятичном формате) является
\a\b\t\n\v\f\r
(по порядку).Подобный (возможно, более переносимый) диапазон может быть записан как
[^[:space:][:print:]] (similar because it doesn't include
\ a \ b` --bell и backspace--).Связанный: регулярное выражение
любого символа ASCII
Perl решение
Текстовый файл Posix
источник
tr
могут быть файлы любого типа, а не только текстовые файлы.awk
с другой стороны, принимает текстовый файл.gensub()
это расширение gawk. Вы хотели быgsub(...); print
, и использовать восьмеричные вместо шестнадцатеричных последовательностей (и LC_ALL = C), чтобы быть (более) переносимым.[^\o0]
должен совпадать с символами, отличными от обратной косой черты, o и 0 в POSIXsed
(во всех реализациях, кроме GNU sed). Это не ограничение GNU,sed
а несовместимое расширение, поэтому оно отключено, когда POSIXLY_CORRECT находится в среде).