Шаблон 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 > $@