Как устранить эту ошибку 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