私はこのファイルを持っています:
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拡張正規表現(ERE
)とgrep -P
Perl互換正規表現()を使用するために使用されます。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