Как устранить эту ошибку sed, когда я переношу скрипт из оболочки в Makefile?

Итак, у меня есть это правило makefile:

header:
    rm -f ./include/temp.txt
    cat ./srcs/ft_*/ft_*.c | grep -E "^\w" | sed 's/$$/;/' | sed '/int main/d' | sed '/int\tmain' >> ./include/temp.txt
    awk '//; /# define/{while(getline<"header.h"){print}}' temp.txt >tmp
    mv tmp header.h

Я пытаюсь создать проект lib, и у меня есть много функций в каталоге./srcs/, каждая функция хранится в каталоге ft_name_of_the_function. Я хочу иметь правило Makefile, которое редактирует файл заголовка библиотеки lib (который находится в./include/ и называется header.h) путем добавления каждого прототипа.

Этот скрипт работал как исполняемый файл оболочки, но, похоже, не работает после того, как я поместил его в make-файл. Я все еще могу сказать make-файлу запустить исполняемый файл оболочки, но я хотел бы понять. Когда я бегу make header это дает мне этот стандартный вывод:

rm -f ./include/temp.txt
cat ./srcs/ft_*/ft_*.c | grep -E "^\w" | sed 's/$/;/' | sed '/int main/d' | sed '/int\tmain' >> ./include/temp.txt
sed: -e expression n°1, caractère 10: expression régulière d'adresse inachevée
Makefile:41: recipe for target 'header' failed
make: *** [header] Error 1

2 ответа

Решение

Эта команда sed:

sed '/int\tmain'

не сформирован должным образом. Вам нужен дополнительный адрес (или адреса) и действие. Если вы запустите это в командной строке, вы получите это:

$  sed '/int\tmain'
sed: -e expression #1, char 10: unterminated address regex

Если вы хотите, чтобы он был похож на предыдущий:

sed '/int main/d'

но с пробелом вместо пробела, вы, вероятно, хотите это:

sed '/int\tmain/d'

Вы можете объединить их, используя \s+ чтобы соответствовать некоторому пробелу:

sed '/int\s+main/d'

Я просто выяснил, что сделал несколько других ошибок, поэтому в некоторых случаях люди пытаются сделать то же самое, вот мой окончательный код:

cp ./include/initlibft.h ./include/libft.h
rm -f ./include/temp.txt
cat ./srcs/ft_*/ft_*.c | grep -E "^\w" | sed 's/$/;/' | sed '/main(/d' >> ./include/temp.txt
awk '//; /# define/{while(getline<"./include/temp.txt"){print}}' ./include/libft.h >tmp
mv tmp ./include/libft.h
Другие вопросы по тегам