MacOS

2012-09-04 22 views
7

üzerine "tanımsız etiketini" sed Geçenlerde Cygwin Linux üzerinde veya altında bu basit sed ifade çalışmaları ince ama bir "tanımlanmamış etiket" hatası ile Mac üzerinde başarısız olduğunu öğrendim GNU muadili farklı seçeneklerle BSD varyantı. Ancak man sed açıkça sed'un MacOS sürümünün etiketleri desteklediğini gösteriyor, bu yüzden neden bu hatayı ve en önemlisi onu nasıl çözebilir?MacOS

cevap

3

etiketin adı değil yarı kolonda, ilk edebi yeni satır ile sona erer. Sorunu çözmenin iki kolay yolu vardır. literal yeni satırları ekleyin:

sed '/SUCCESSFUL/d 
    /\[java\]/!b label 
    s/\s\+\[java\]// 
    /^\s*$$/d; /Compiling/!d 
    :label 
    /^\s*$$/d 
    s/^/monitor: /' 

Veya kullanım birden -e seçenekleri:

sed -e '/SUCCESSFUL/d ; /\[java\]/!b label' \ 
    -e 's/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d' \ 
    -e':label' -e'/^\s*$$/d; s/^/monitor: /' 
2

SO ile ilgili benzer sorular var ama bunların çoğu, platformlar arasında farklılık gösteren -i davranışından kaynaklanıyor, bu yüzden farklı.

Bu durumda, sorun oldukça basittir: etiket referansları yalnızca sed BSD sürümünde geriye doğru gidebilirken, GNU sürümü ileriye dönük referansların kullanılmasına izin veriyor gibi görünüyor. Bu MacOS'ta, :label,b label'dan önce görünmelidir. Çözüm, ya etiketin daldan önce tanımlanması ya da yukarıdaki ifadenin gerçekleşmesi durumunda, dalın bir tür "eğer bu kalıp mevcut değilse ... ileriye atlamak" şeklindeki ifadesi yeniden yazmaktır. Bu durumda ifade ilk etapta etiketi gerekmez şekilde genişletilebilir:

sed '/SUCCESSFUL/d ; /\s+\[java\]\s*/d; /\[java\]/s/\s\+\[java\]//; /Compiling/!d; /^\s*$$/d; s/^/monitor: /' 
+0

+1 ve İyi yakalamak. Ayrıca, tek liner-itis :-) yerine iyi girmiş kodlar gibi, içeriğin girintili kod olarak görselleştirilmesine yardımcı olur. – shellter

İlgili konular