sedを使用して特定の単語の後に続く文字列から値を抽出する

sedを使用して特定の単語の後に続く文字列から値を抽出する

コマンド出力から特定の値だけを抽出したいです。

このコマンドで返される文字列は次のとおりです。

Result: " 5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)"

filter()の間には「60秒」の値だけが必要です。

22.3456%

どうすればいいですか?

答え1

これがまさにコマンドから返された文字列であればうまくsedいきます。

command_output | sed 's/.*60 Secs..\(.*\)..300.*/\1/'

これにより、60 Secs (との間のすべての内容が印刷されます) 300

結果:

22.3456%

答え2

はい、そうすることができますsed。ただ検索してから最初の文字が出るまで、文字ではなく文字をできるだけ多く60 Secs (検索してください。-%%

$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" | 
    sed 's/.* 60 Secs (\([^%]*%\).*/\1/'
22.3456%

またはPerlでは:

$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" | 
    perl -lne '/.* 60 Secs \(([^%]*%)/; print "$1"'
22.3456%

または、型が標準で常に6番目のフィールドが必要であることがわかっている場合は、次のようにします。

$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" | 
    awk '{gsub(/[()]/,""); print $6}'
22.3456%

または:

$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" | 
    cut -d' ' -f6 | tr -d '()'
22.3456%

答え3

grep代わりにGNUを使用できますsed

$ foo='Result: "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)"'
$ echo "$foo" | grep -Po "(?<= 60 Secs \()[0-9\.%]*"
22.3456%

そしてsed

$ echo "$foo" | sed 's/^.* 60 Secs (\([0-9\.%]*\).*$/\1/'
22.3456%

どちらのコマンドも0-9.%「60秒」(」。

そしてawk

$ echo "$foo" | awk -F'[() ]' '{ print $10 }'
22.3456%

答え4

grep -Pまた、\K試合開始時間をリセットすることもできます。

$ echo "$result" | grep -Po '60 Secs \(\K[^)]*'
22.3456%

関連情報