Путаница Sed One-Liner в учебнике Makefile - PullRequest
7 голосов
/ 05 мая 2011

Кто-нибудь может объяснить этот sed-one-liner на английском (чем больше деталей, тем лучше)?

@sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' < $*.d > $@; \
             rm -f $*.d; [ -s $@ ] || rm -f $@

Это часть этого урока: http://mad -scientist.net / make /autodep.html

У меня непостоянный набор исходных файлов, и я хочу автоматически сгенерировать мое дерево зависимостей на основе содержимого (включенного), указанного в моих исходных файлах.

До этого момента я очень хорошо следовал учебнику ...

PS У меня есть базовое понимание выбора / замены sed, но меня смущает соответствующая строка и все слои перенаправления ...Я также однажды прочитал учебник по make-файлам, поэтому имею базовые знания стандарта make-файлов ...

1 Ответ

12 голосов
/ 05 мая 2011

Шаблон sed будет обработан make первым, поэтому, если правило, к которому он применяется, пытается построить foo.P, то $@ будет преобразовано в foo.P и $* в foo. Это означает, что фактическая команда sed будет выглядеть примерно так:

sed 's/\(foo\)\.o[ :]*/\1.o foo.P : /g' < foo.d > foo.P

\(foo\) соответствует foo точно и устанавливает первую замену на то, что соответствует (т.е. foo) \. соответствует буквальной точке, а [ :]* соответствует любому количеству пробелов и двоеточий.

Как видите, замена \1 немного избыточна, так как совпадающая строка является фиксированной. Это сработало бы так же хорошо.

sed 's/foo\.o[ :]*/foo.o foo.P : /g' < foo.d > foo.P

который мог быть сделан из:

sed 's/$*\.o[ :]*/$*.o $@ : /g' < $*.d > $@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...