我有這個文件:
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