Как я могу разобрать Makefile с помощью awk

Я новичок в написании сценариев на awk. Мне нужна помощь в поиске способа синтаксического анализа make-файла.

Ниже мой пример файла make. Я использую "make tests" для запуска своих тестов. Все тестовые файлы перечислены в «LTESTS =». Здесь я перечислил только 3 файла (connect, proxy-connect, connect-privsep), но на самом деле у меня есть 70 файлов. Как мне получить все файлы, перечисленные в "LTESTS =".

Я искал, но не мог найти способ извлечь. Спасибо за вашу помощь.

    REGRESS_TARGETS=    t-exec
tests:      prep $(REGRESS_TARGETS)

prep:
    test "x${USE_VALGRIND}" = "x" || mkdir -p $(OBJ)/valgrind-out

LTESTS=     connect \
        proxy-connect \
        connect-privsep



t-exec: ${LTESTS:=.sh}
    @if [ "x$?" = "x" ]; then exit 0; fi; \
    for TEST in ""$?; do \
        echo "run test $${TEST}" ... 1>&2; \
        (env SUDO = "${SUDO}" TEST_ENV=${TEST_ENV} ${TEST_SHELL} ${.CURDIR}/test-exec.sh ${.OBJDIR} ${.CURDIR}/$${TEST}) || exit $$?; \
    done
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
249
2

Ответы 2

Вы можете просто переписать разделитель полей следующим образом:

awk 'BEGIN { 
    FS = "[ \t=]*(\\\\[ \t]*\r?\n[ \t]*)?"
    RS = "" 
}
$1 == "LTESTS" { 
    for(i=2;i<=NF;i++) print $i 
}
' Makefile

Обратите внимание, что RS = "" означает, что он ожидает пустую строку до и после LTESTS.

Выход:

connect
proxy-connect
connect-privsep
$ awk 'sub(/.*LTESTS=/,""){f=1} !NF{f=0} f{print $1}' file
connect
proxy-connect
connect-privsep

или если у вас нет пустой строки после блока LTESTS:

awk 'sub(/.*LTESTS=/,""){f=1} f{print $1; if (!/\/) exit}' file

Это не сработает, даже если LTESTS содержит два значения в одной строке. Как этот LTESTS = connect proxy-connect.

Andriy Makukha 22.05.2018 06:48

Если OP должен иметь дело с этой ситуацией (или любой другой, о которой она нам еще не рассказала, например, если LTESTS может быть в нижнем регистре или если FOOLTESTS могут существовать, или у нее есть имена файлов с пробелами в списке или ...) затем ей нужно обновить опубликованный пример, чтобы показать его.

Ed Morton 22.05.2018 13:50

Другие вопросы по теме