使用grep从基于正则表达式的文件中提取一些文本

Pha*_*ate 2 grep

我有这个文件:

header:
  title: hello
  version: 1.2.3
Run Code Online (Sandbox Code Playgroud)

我想提取版本号。

我最初的尝试是

grep ^\s+version:\s+(\d\.\d\.\d) file.txt
Run Code Online (Sandbox Code Playgroud)

但这产生了空输出。在评论中提出建议后,我尝试了

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt
Run Code Online (Sandbox Code Playgroud)

但我得到“版本:1.2.3”而不是“1.2.3”。

我究竟做错了什么?

pLu*_*umo 10

grep默认情况下使用Posix Basic Regex ( BRE),它不支持您的表示法。

使用grep -E使用POSIX扩展正则表达式(ERE),并grep -P使用Perl兼容的正则表达式(PCRE如果可用)。

您的符号适用于grep -P

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt
Run Code Online (Sandbox Code Playgroud)

这适用于BRE

grep '^ \+version: \+\([0-9]\.[0-9]\.[0-9]\)' file.txt
Run Code Online (Sandbox Code Playgroud)

输出:

  version: 1.2.3
Run Code Online (Sandbox Code Playgroud)

请注意,这里grep不需要捕获组,因为它不会做任何事情。


如果您只想要版本 nr.,请使用\K-o选项:

grep -Po '^\s+version:\s+\K\d\.\d\.\d' file.txt
Run Code Online (Sandbox Code Playgroud)

输出:

1.2.3
Run Code Online (Sandbox Code Playgroud)

使用BRE,这是不可能的,您需要链接两个grep命令:

grep 'version: ' file.txt | grep -o '[0-9]\.[0-9]\.[0-9]'
Run Code Online (Sandbox Code Playgroud)

或使用sed(学分@Kusalananda):

sed -n 's/.*version: //p' file.txt
Run Code Online (Sandbox Code Playgroud)