これはすべての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