Grep:如何提取这些标签之间的版本字符串:<version>1.1.9-beta</version>

Grep: How to extract version string between these tags: <version>1.1.9-beta</version>

我想使用命令行正则表达式提取这些标签之间的版本号:

$ cat file.xml
<version>1.0-beta</version>

# example of solution
$ grep regex file.xml  
1.0-beta

grep 与 PCRE (-P) 结合使用:

grep -Po '<version>\K[^<]+(?=</version>)' file.xml

示例:

$ grep -Po '<version>\K[^<]+(?=</version>)' <<<'<version>1.0-beta</version>'
1.0-beta

你可以试试这个:

\<version\>(.*?)\</version\>

这是一个同样适用于 BSD 或非 GNU 版本的 awk 命令:

awk -F '</?version>' '{print }' file

1.0-beta

如果您需要适用于 任何 标签的内容:

grep -Po "(?<=>)[^<>]*(?=<)" file.xml

Live demo on regex101

解释:

-P :将模式解释为 Perl 正则表达式 (PCRE),这是必需的,因为我们使用 lookarounds

-o : 只打印模式匹配的内容,多个匹配用新行分隔

(?<=>) :匹配 >

的正后视

[^<>]* : 字符 class 匹配任何字符但不匹配 < 也不匹配 >, * 表示 0 次或多次

(?=<) :匹配 <

的正向前看