Удаление всех не-ascii символов из рабочего процесса (файла)

Нет!

Не делайте этого!!!

Во что бы то ни стало имейте копию вашего crontab (и других), хранящуюся где-то, например, в вашем домашнем каталоге, но не трогайте системные файлы.

vi my_crontab         # Edit my copy of the crontab file
crontab my_crontab    # Install it

(Лично я использую $HOME/.crontab для своей копии для каждого пользователя.)

Лучшим способом отслеживания системных файлов будет создание репозитория исходного кода (git, cvs, mercury, что угодно) и использование его для отслеживания изменений. Можно использовать Makefile для установки изменений в соответствующие системные каталоги и перезапуска зависимых служб; в этом сценарии вы просто набираете sudo make install, и это приводит к.

12
15.10.2018, 14:15
3 ответа

Символы 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
32
27.01.2020, 19:54

Сperl

perl -pi -e 's/[^[:ascii:]]//g'
16
27.01.2020, 19:54

Если все, что вам нужно, это регулярное выражение:[\x00-\x7F].
Которые можно применить к нескольким утилитам:

<file LC_ALL=C   sed   's/[^\o0-\o177]//g'      # GNU sed not POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^\0-\177]/,"");print}'
<file            perl  -pe 's/[^[:ascii:]]//g;'
<file            tr    -dc '\0-\177'

Поймите, что sed, awk и perl ожидают «текстовые файлы», как это определено в Unix. Все хорошо работает в таком случае. Но, в частности, awk добавляет завершающую новую строку (, независимо от того, существует ли она в исходном файле или нет )(, замена print на printf может удалить ВСЕ новые строки на входе ). trпредназначен для работы с файлами любого типа. Однако NUL(\0)не является допустимым символом в текстовом файле POSIX , и его следует избегать :

.

The lines do not contain NUL characters...

На самом деле, многие управляющие символы при некоторых специфических условиях вызывали бы другие проблемы.
Итак, вероятно, вам нужно[\x07-\x0d\x20-\x7e]

<file LC_ALL=C   sed   's/[^\o007-\o015\o040-\o176]//g'            # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^\0-\15\40-\176]/,"");print}'
<file            perl  -pe 's/[^\x{7}-\x{d}\x{20}-\x{7e}]//g;'
<file            tr    -dc '\7-\15\40-\176'

Диапазон 7 -13 (в десятичном )равен\a\b\t\n\v\f\r(в порядке ).
Аналогичный (, вероятно, более переносимый )диапазон может быть записан как [^[:space:][:print:]] (similar because it doesn't include \a\b`--bell and backspace --).

<file LC_ALL=C   sed   's/[^[:space:][:print:]]//g'  # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^[:space:][:print:]]/,"");print}'
<file            perl   -pe 's/[^[:space:][:print:]]//g;'
<file            tr     -dc '[:space:][:print:]'

Связанные:
Регулярное выражение любого символа ASCII
Перл раствор
Текстовый файл Posix

9
27.01.2020, 19:54

Теги

Похожие вопросы