Как мне разрешить эту ошибку sed, когда я переношу скрипт из оболочки в Makefile? - PullRequest
0 голосов
/ 10 ноября 2018

Итак, у меня есть правило 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
    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 ]

0 голосов
/ 10 ноября 2018

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

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
0 голосов
/ 10 ноября 2018

Эта команда 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'
...