正規表現に基づいてファイルからテキストを抽出するにはgrepを使用します

正規表現に基づいてファイルからテキストを抽出するにはgrepを使用します

このファイルがあります:

header:
  title: hello
  version: 1.2.3

バージョン番号を抽出したいです。

私の最初の試みは

grep ^\s+version:\s+(\d\.\d\.\d) file.txt

しかし、それは空の出力を生成しました。コメントの提案を受けて、私は試しました

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt

しかし、「1.2.3」ではなく「バージョン: 1.2.3」が表示されます。

何が間違っているのでしょうか?

答え1

grep用途Posix 基本正規表現BREデフォルトでは( ) ですが、これはあなたの表記をサポートしていません。

grep -EPosix Extended Regex ( ERE)を使用する場合は を使用し、使用可能な場合はgrep -PPerl 互換 Regex ( PCRE) を使用します。

あなたの表記法は以下で機能しますgrep -P:

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt

これは以下で動作しますBRE:

grep '^ \+version: \+\([0-9]\.[0-9]\.[0-9]\)' file.txt

出力:

  version: 1.2.3

キャプチャ グループはここでは必要ないので、grep何もしないことに注意してください。


バージョン番号のみが必要な場合は、使用\Kオプション-o:

grep -Po '^\s+version:\s+\K\d\.\d\.\d' file.txt

出力:

1.2.3

ではBREこれは不可能なので、2 つのgrepコマンドを連結する必要があります。

grep 'version: ' file.txt | grep -o '[0-9]\.[0-9]\.[0-9]'

または使用してくださいsed(クレジット: @Kusalananda):

sed -n 's/.*version: //p' file.txt

答え2

コメントによるとプルモそしてgrep を使用して名前の直後の文字列を取得する方法機能するコマンドは

 grep -oP "(?<=version: )(\d\.\d\.\d)" file.txt

関連情報