2011-05-04 22 views
6

Bu sedef tek lineli İngilizce olarak açıklayabilir mi (daha fazla detay, daha iyi)?Makefile Öğreticisinde Sed Tek-Liner'in karıştırılması

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

Bu öğretici parçası: Ben kaynak dosyalarının sabit olmayan bir set var ve içeriğine göre benim bağımlılık ağacını, otomatik oluşturmak istediğiniz http://mad-scientist.net/make/autodep.html

(dahil) dile benim kaynak dosyaları.

Ben öğretici takip ediyordu Oldukça iyi olduğu kadar ...

Not; Ben sed select/replace temel anlayış var, ama ben eşleşen dize ve yeniden yönlendirme tüm katmanları tarafından kafam karıştı .... Ben de bir kez maketle öğretici üzerinden okudum böylece standart makefiles temel bilgi var .. .

+1

, geçici rm parçasını kaldırmak ya da ben üretim modunda olsaydı şimdi çıkarmadan olurdu gibi bir şey demek için orada bir yankı koymak . – octopusgrabbus

+0

Gözlerim kanıyor. –

cevap

11

sed desen ilk marka tarafından işlenecektir, bu nedenle de geçerlidir kural foo.P sonra [email protected]foo için foo.P ve $* çevrilir inşa etmeye çalışıyor eğer. Bu gerçek sed komutu gibi bir şey olacağı anlamına gelir: Tam

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

\(foo\) maçları foo ve maçları ne ilk değiştirilmesini ayarlar (yani foo) \. değişmez nokta eşleşir ve [ :]* boşluk ve iki nokta üst üste herhangi bir sayıda eşleşir.

\1 yedeklemesini gördüğünüz gibi, eşleşen dize sabitlendikçe yedeklemenin biraz fazlası var. Bu da işe yarayacaktı. dan yapılmış olabilir

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

: Bu test ederken

sed 's/$*\.o[ :]*/$*.o [email protected] : /g' < $*.d > [email protected] 
+0

Harika! Çok teşekkür ederim ... İlk "rm" foo.d' kaldırır görüyorum ... bana ikincisi "foo.P" için kontrol eder gibi görünüyor ve daha sonra var değilse kaldırır? Bu mantıklı değil. Birisi bana [conditional] || command' mantığının kabuk betiğinde nasıl çalıştığı hakkında kısa bir açıklama yapabilir mi? –