Константа | Значение |
---|---|
WRDE_BADCHAR | Метасимвол (конец строки, '|', &, ;, <, >, (, ), {, или }) в недопустимом месте |
WRDE_BADVAL | Переменная не определена при установленном WRDE_UNDEF |
WRDE_CMDSUB | Попытка подстановки команды при установленном WRDE_NOCMD |
WRDE_NOSPACE | Была проблема с выделением динамической памяти |
WRDE_SYNTAX | Синтаксическая ошибка оболочки. |
Мы оставляем вам в качестве упражнения (см. далее) модификацию ch12-glob.c
для использования wordexp()
и wordfree()
. Вот наша версия в действии:
$ ch12-wordexp 'echo $HOME' /* Развертывание переменных оболочки */
echo
/home/arnold
$ ch12-wordexp 'echo $HOME/*.gz' /* Переменные и символы подстановки */
echo
/home/arnold/48000.wav.gz
/home/arnold/ipmasq-HOWTO.tar.gz
/home/arnold/rc.firewall-examples.tar.gz
$ ch12-wordexp 'echo ~arnold' /* Развертывание тильды */
echo
/home/arnold
$ ch12-wordexp 'echo ~arnold/.p*' /* Тильда и символы подстановки */
echo
/home/arnold/.postitnotes
/home/arnold/.procmailrc
/home/arnold/.profile
$ ch12-wordexp "echo '~arnold/.p*'" /* Кавычки работают */
echo
~arnold/.p*
grep
, egrep
, sed
, awk
, Perl, а также редакторы ed
, vi
, vim
и Emacs. Если вы вообще не знакомы с регулярными выражениями, мы рекомендуем ознакомиться с некоторыми из книг или URL, указанных в разделе 12.9 «Рекомендуемая литература».
POSIX определяет два вида регулярных выражений: базовый и расширенный. Программы типа grep
, sed
и строчный редактор ed
используют базовые регулярные выражения. Программы типа egrep
и awk
используют расширенные регулярные выражения. Следующие функции дают вам возможность использовать в своих программах любой вид.
#include
#include
int regcomp(regex_t *preg, const char *regex, int cflags);
int regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
size_t regerror(int errcode, const regex_t *preg,
char *errbuf, size_t errbuf_size);
void regfree(regex_t *preg);
Чтобы сопоставить регулярное выражение, нужно сначала
int regcomp(regex_t *preg, const char *regex, int cflags)
Компилирует регулярное выражение regex
во внутреннее представление, сохраняя его в структуре regex_t
, на которую указывает preg
. cflags
контролирует процесс компиляции; ее значение равно 0 или побитовому ИЛИ одного или более флагов из табл. 12.7
int regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags)
Выполняет откомпилированное регулярное выражение в *preg
в строке string eflags
контролирует способ выполнения; ее значение равно 0 или побитовому ИЛИ одного или более флагов из табл. 12.8. Вскоре мы обсудим другие аргументы.
size_t regerror(int errcode, const regex_t *preg,
char *errbuf, size_t errbuf_size)
Преобразует ошибку, возвращенную regcomp()
или regexec()
, в удобочитаемую строку.
void regfree(regex_t *preg)