11

私は最近、この単純なsed式がLinuxまたはCygwinで正常に機能するが、Macでは「未定義のラベル」エラーで失敗することを発見しました。

$ 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: /'

sedMacOSでは、GNUの対応物とは異なるオプションを備えたBSDバリアントです。ただしman sed、MacOSバージョンのサポートラベルを明確に示しているsedので、なぜこのエラーが発生するのか、そして最も重要な解決方法は何でしょうか。

4

3 に答える 3

9

ラベルの名前は、セミコロンではなく、最初のリテラル改行で終了します。問題を解決する簡単な方法は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: /'
于 2012-09-04T23:06:34.720 に答える
4

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: /'
于 2012-09-04T22:14:31.027 に答える
1

( MacOSで)同様の問題を抱えている他の人のための簡単な修正は次のようになります:

文字列式の前に空の文字列を追加します。''

例:代わりに

sed -i 's/foo/bar/g' text.txt

書きます:

sed -i '' 's/foo/bar/g' text.txt

于 2021-11-13T15:40:11.537 に答える