Нет!
Не делайте этого!!!
Во что бы то ни стало имейте копию вашего 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
, и это приводит к.
Символы 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
Если все, что вам нужно, это регулярное выражение:[\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