42751


`"_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]

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

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


CC BY-SA 3.0
2018-03-29T09:56:22.463
42749
2019-06-26T22:46:45.390
2018-03-29T11:25:20.407
27935
27935
question
bash sh command-line sed
sedで文字列を取り出すにはどうやればいいでしょうか？

[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]

とか。


CC BY-SA 3.0
2018-03-29T10:51:28.987
42751
2018-03-29T21:53:40.867
2018-03-29T21:53:40.867
25936
25936
42749
answer


`grep` の `-o` オプションを利用するのはどうでしょうか？

[code]

    $ echo "aaa bbb foo_app_bar ccc ddd test_app_" | grep -o '[^ ]*_app_[^ ]*'
    foo_app_bar
    test_app_
    
[/code]


CC BY-SA 4.0
2019-06-10T00:27:50.333
55659
2019-06-10T00:27:50.333
34583
42749
answer