2012-09-04 11 views
7

の「未定義のラベルを」sedの私は最近、CygwinのLinux上または下のこの単純なsed表現の作業罰金はなく、「未定義ラベル」エラーでMac上で失敗したことが判明しましたGNUのものとは異なるオプションを持つBSDの亜種です。しかし、man sedは、sedのMacOSバージョンを明確に示しています。なぜこのエラーが発生したのですか?MacOSの

答えて

3

ラベルの名前はセミコロンで最初のリテラルの改行、ないで終了します。問題を解決するには2つの簡単な方法があります。リテラル改行を追加します。

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の動作が原因です。これは異なるものです。

この場合、問題は簡単です:BSDバージョンsedではラベル参照が後ろに行くように見えますが、GNUバージョンでは前方参照を使用できます。 MacOSの場合、:labelの前にb labelと表示されなければなりません。

解決策は、ブランチの前にラベルを定義するか、または上の式の場合にブランチが "このパターンが存在しない場合はジャンプしてください"というように式を書き直すことです。この場合、式は最初の場所でラベルを必要としないように拡張することができます。

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

+1と大漁を。また、問題をワンライナーではなくインデントされたコードとして視覚化するのに役立ちます:-)幸いです。 – shellter