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

相关内容