使用 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 -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

相關內容