Книга: Искусство программирования на языке сценариев командной оболочки
Пример 12-24. Удаление комментариев из файла с текстом программы на языке C
Пример 12-24. Удаление комментариев из файла с текстом программы на языке C
#!/bin/bash
# strip-comment.sh: Удаление комментариев (/* COMMENT */) из исходных текстов программ на языке C.
E_NOARGS=65
E_ARGERROR=66
E_WRONG_FILE_TYPE=67
if [ $# -eq "$E_NOARGS" ]
then
echo "Порядок использования: `basename $0` C-program-file" >&2 # Вывод сообщения на stderr.
exit $E_ARGERROR
fi
# Проверка типа файла.
type=`eval file $1 | awk '{ print $2, $3, $4, $5 }'`
# "file $1" -- выводит тип файла...
# затем awk удаляет первое поле -- имя файла...
# после этого результат записывается в переменную "type".
correct_type="ASCII C program text"
if [ "$type" != "$correct_type" ]
then
echo
echo "Этот сценарий работает только с исходными текстами программ на языке C."
echo
exit $E_WRONG_FILE_TYPE
fi
# Довольно замысловатый сценарий sed :
#--------
sed '
/^/*/d
/.*/*/d
' $1
#--------
# Если вы потратите несколько часов на изучение основ sed, то он станет немного понятнее.
# Следовало бы добавить еще обработку
#+ комментариев, расположенных в одной строке с кодом.
# Оставляю это вам, в качестве упражнения.
# Кроме того, этот сценарий удалит все строки, которые содержат комбинации символов "*/" или "/*",
# не всегда желаемый результат.
exit 0
# ----------------------------------------------------------------
# Строки, расположенные ниже не будут исполнены из-за стоящей выше команды 'exit 0'.
# Stephane Chazelas предложил другой, альтернативный вариант:
usage() {
echo "Порядок использования: `basename $0` C-program-file" >&2
exit 1
}
WEIRD=`echo -n -e '377'` # или WEIRD=$'377'
[[ $# -eq 1 ]] || usage
case `file "$1"` in
*"C program text"*) sed -e "s%/*%${WEIRD}%g;s%*/%${WEIRD}%g" "$1"
| tr '377n' 'n377'
| sed -ne 'p;n'
| tr -d 'n' | tr '377' 'n';;
*) usage;;
esac
# Этот вариант, все еще некорректно обрабатывает такие строки как:
# printf("/*");
# или
# /* /* ошибочный вложенный комментарий */
#
# Для обработки специальных случаев (", " ...) придется написать синтаксический анализатор
# (может быть с помощью lex или yacc?).
exit 0
which
Команда which command-xxx вернет полный путь к "command-xxx". Очень полезна для того, чтобы узнать -- установлена ли та или иная утилита в системе.
$bash which rm
/usr/bin/rm
whereis
Очень похожа на which, упоминавшуюся выше. Команда whereis command-xxx вернет полный путь к "command-xxx", но кроме того, еще и путь к manpage -- файлу, странице справочника по заданной утилите.
$bash whereis rm
rm: /bin/rm /usr/share/man/man1/rm.1.bz2
whatis
Утилита whatis filexxx отыщет "filexxx" в своей базе данных. Может рассматриваться как упрощенный вариант команды man.
$bash whatis whatis
whatis (1) - search the whatis database for complete words
- Пример 12-23. Распаковка архива rpm
- Пример 12-24. Удаление комментариев из файла с текстом программы на языке C
- Пример 12-25. Исследование каталога /usr/X11R6/bin
- Пример 12-26. "Расширенная" команда strings
- Пример 12-27. Пример сравнения двух файлов с помощью cmp.
- Пример 12-28. Утилиты basename и dirname
- Пример 12-29. Проверка целостности файла
- Пример 12-30. Декодирование файлов
- 5.1.5. Удаление файла
- 3.5.2. Удаление программы
- Пример установочного скрипта
- Пример из практики
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Эффективная работа с временными файлами сортировки
- Примеры получения статистики
- Пример применения метода «пять почему»
- Единое имя файла параметров InterBase
- Параметры конфигурационного файла InterBase
- Пример 12-8. Частота встречаемости отдельных слов