我有这个文件:
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