他のコマンドの出力からIDを抽出する必要があります。現在私の抽出コマンドは次のとおりです。
someID=$(command | grep -oP '(?:^Successfully\sbuilt\s)([\da-z]{12}$)' | grep -oP '([a-z\d]{12})')
コマンド出力の例:
---> Using cache
---> 9b4624927fa6
Successfully built 9b4624927fa6
予想される結果:
9b4624927fa6
行から抽出されたID
Successfully built 9b4624927fa6
この2つのgrepステートメントを1つにまとめるにはどうすればよいですか?
答え1
私の最初の作品を少し修正しましたgrep
。
$ grep -oP '^Successfully\sbuilt\s\K[\da-z]{12}$' example-output
9b4624927fa6
\K
PCREからゲームをリセットして始めましょう:
エスケープシーケンスの
\K
ため、以前に一致した文字は最終一致シーケンスに含まれません。
幅0の肯定的な振り返りアサーションに似ています (?<=Successfully...
。
答え2
で始まる行末の16進数を取得するには、Successfully built
次のようにしますsed
。
sed -n -E 's/^Successfully built ([[:xdigit:]]+)$/\1/p'
これにより、一致する行がハッシュに変わり、印刷されます(他の行は除く)。
またはawk
:
awk '/^Successfully built [[:xdigit:]]+$/ { print $NF }'
これにより、正規表現に一致する各行の最後のスペースで区切られたフィールドが印刷されます。
両方の正規表現では、その式[[:xdigit:]]+
は空でない16進文字列と一致します。