このファイルがあります:
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 -E
Posix Extended Regex ( ERE
)を使用する場合は を使用し、使用可能な場合はgrep -P
Perl 互換 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