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拡張正規表現(ERE)とgrep -PPerl互換正規表現()を使用するために使用されます。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不可能です。両方のコマンドを接続する必要があります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

関連情報