sedで文字列を取り出すにはどうやればいいでしょうか？


`"_app_"`だけが必ず出現する`"aaa bbb foo_app_bar ccc
ddd"`のような文字列から、`sed`を使って`"foo_app_bar"`を取り出したいです。

[code]

    echo "aaa bbb foo_app_bar ccc ddd" | sed -n "s/.*\([^\s]*_app_[^\s]*\).*/\1/p"
    
[/code]

を試してみましたが望みどおりに動作しませんでした。

どうやればいいでしょうか？



[code]

    echo "aaa bbb foo_app_bar ccc ddd" | sed "s/.*[[:space:]]\([^[:space:]]\+_app_[^[:space:]]\+\).*/\1/"
    
[/code]

GNU sedでは上記のようにすれば`"_foo_app_bar"`を取り出せました。

以下は[metropolis](https://ja.stackoverflow.com/users/16894/metropolis)さんからのコメントを元にしています。  
BSD由来の`sed`の場合、`\s` や `[:space:]` などの正規表現が利用できない様ですね。例えば

[code]

    echo"aaa bbb foo_app_bar ccc ddd" | sed 's/.*[ \t]\(.*_app_[^ \t]*\)[ \t].*/\1/'
    
[/code]

とか。



[code]

    echo "aaa bbb foo_app_bar ccc ddd" | sed "s/.*[[:space:]]\([^[:space:]]\+_app_[^[:space:]]\+\).*/\1/"
    
[/code]

GNU sedでは上記のようにすれば`"_foo_app_bar"`を取り出せました。

以下は[metropolis](https://ja.stackoverflow.com/users/16894/metropolis)さんからのコメントを元にしています。  
BSD由来の`sed`の場合、`\s` や `[:space:]` などの正規表現が利用できない様ですね。例えば

[code]

    echo"aaa bbb foo_app_bar ccc ddd" | sed 's/.*[ \t]\(.*_app_[^ \t]*\)[ \t].*/\1/'
    
[/code]

とか。

