BSD sed対GNU - 一致を入れ子にできますか?

BSD sed対GNU - 一致を入れ子にできますか?

これはすべてのLinuxで完全に機能します。

$ echo foo bar | sed -n '/foo/{/bar/{;p;}}'
foo bar

しかし、OSXの以前のBSDバリアントでは失敗します。

❯  echo foo bar | sed -n  '/foo/{/bar/{;p;}}' 
sed: 1: "/foo/{/bar/{;p;}}": extra characters at the end of } command

私は魔法の呪文を逃したのでしょうか?移植可能な方法で書く方法はありますか?

grep | grep | grepコマンドパイプラインに戻したくありません。

更新:ここでは代表性が低いため投票できません。しかし、思いやりのある提案に答えてくださった皆さんに感謝します。

答え1

編集コマンドは、改行文字またはリテラル改行文字で終了する必要がありますsed;GNUはsedこれについて非常に寛大です。

あなたのスクリプト:

/foo/{/bar/{;p;}}

拡張:

/foo/{
    /bar/{
        p
    }
}

これはを通じてsed提供されるsedスクリプトとして機能します-f

コマンドラインで使用できるように改行文字を;(コマンドとコマンドグループの終わりにのみ必要です)に置き換えると、次のような結果が得られます。{...}

/foo/{/bar/{p;};}

これはOpenBSDで動作します(2番目のバージョンがないsedため、元のバージョンは機能しません)。;

この特別なケースでは、次のようにさらに簡素化できます。

/foo/{/bar/p;}

答え2

これはBSDで動作するようですsed

$ echo -e "foo bar\nfoo\nbar" | sed -n '/foo/{/bar/p;}'
foo bar

2 つのレベルのネストにも同様に適用されます。

$ echo -e "foo bar\nfoo\nbar" | sed -n '/foo/{/bar/{p;};}'
foo bar

関連情報