Книга: Искусство программирования на языке сценариев командной оболочки

Пример 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

Оглавление книги


Генерация: 1.313. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз