2012-09-04 59 views
7

最近我發現,在Linux或在Cygwin的這個簡單的sed表達做工精細,但在Mac上失敗,一個「未定義標籤」錯誤:sed的「未定義標籤」在MacOS

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

sed在MacOS是BSD變種與GNU變種不同。不過man sed明確表示支持標籤的sed的MacOS版本,爲什麼這個錯誤,最重要的是如何解決呢?

回答

3

標籤的名稱與第一面值換行符終止,而不是在分號。有兩個簡單的方法可以解決這個問題。添加文字換行:

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

或使用多個-e選項:

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

在SO上有一堆類似的問題,但其中大部分是由於平臺之間的差異-i的行爲,所以這是不同的。

在這種情況下,問題很簡單:似乎標籤引用只能在sed的BSD版本中倒退,而GNU版本允許使用前向引用。這是在MacOS上,:label必須出現之前b label

解決方法是重寫表達式,以便在分支之前定義標籤,或者在上述表達式的情況下意識到分支是一種「如果此模式不存在...向前跳躍」。在這種情況下,表達可以擴展到不需要標籤在首位:

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

+1和良好的漁獲物。它也有助於將問題看成是縮進代碼,而不是一行代碼 - itis :-)祝你好運。 – shellter