Я новичок в написании сценариев на 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





Вы можете просто переписать разделитель полей следующим образом:
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
Если OP должен иметь дело с этой ситуацией (или любой другой, о которой она нам еще не рассказала, например, если LTESTS может быть в нижнем регистре или если FOOLTESTS могут существовать, или у нее есть имена файлов с пробелами в списке или ...) затем ей нужно обновить опубликованный пример, чтобы показать его.
Это не сработает, даже если LTESTS содержит два значения в одной строке. Как этот
LTESTS = connect proxy-connect.