這個語句分為好幾層,我們一層一層來看
1. sed 's,\($*\)\.o[ :],\1.o $@ : ,g' <$@.$$$$ > $@
首先看加粗這一層,$@表示目標參數中的.d文件, ‘<’ 將.d文件的內容交給sed處理. $@.$$$$是一個臨時文件,.d文件中的內容輸入到臨時文件,再由臨時文件輸入到.d文件中(只有這樣.d文件才能有數據)
2. sed 's,\($*\)\.o[ :],\1.o $@ : ,g' <$@.$$$$ > $@
這個 ’>‘ 將 sed處理之后的內容再返回給.d文件
3. 現在具體分析sed中的內容
由於sed中的分隔符可以自定義,這里的分割符為','逗號,逗號將整個語句分為四個部分
3.1 s,\($*\)\.o[ :],\1.o $@ : ,g
表示sed文件處理方式為替換文件內容,s,a,b 表示將a替換為b
3.2 's,\($*\)\.o[ :],\1.o $@ : ,g
\(\)表示保存文件的內容,$*表示文件名中除后綴名以外的文件名,同時可以使用\1來表示
.o 表示與 文件名中的.o匹配
[ :]中間是一個空格和一個分號,[]表示與其內容中的某一個字符匹配,因為.d中內容一般為 a.o : a.c a.h b.h之類的內容,[]中的內容對應':'以及左右的空格的內容。因此[ :]對應.o后面的空格或是分號。
3.3 's,\($*\)\.o[ :],\1.o $@ : ,g'
/1.o表示前面的$*,也就是a.o ;$@表示 a.d也就是.d文件,然后就是' : '
3.4 's,\($*\)\.o[ :],\1.o $@ : ,g'
g 獲得內存緩沖區的內容,並替代當前模板塊中的文本;
因此上述的內容就是將 a.o : a.c a.h b.h 替換為 a.o a.d : a.c a.h b.h
此上。