在 bash 中使用 grep/regex 提取版本

Nik*_*Nik -3 regex bash grep

我有一个文件,其中有一行说明

version = "12.0.08-SNAPSHOT"
Run Code Online (Sandbox Code Playgroud)

单词version和带引号的字符串可以出现在该文件的多行中。

我正在寻找可以输出以下字符串的单行 bash 语句:

12.0.08-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

版本也可以有 RELEASE 标签而不是 SNAPSHOT。

所以总结一下,给定

version = "12.0.08-SNAPSHOT"
expected output: 12.0.08-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

并给予

version = "12.0.08-RELEASE"
expected output: 12.0.08-RELEASE
Run Code Online (Sandbox Code Playgroud)

Soc*_*owi 5

以下命令打印包含在 中的字符串version = "..."

grep -Po '\bversion\s*=\s*"\K.*?(?=")' yourFile
Run Code Online (Sandbox Code Playgroud)

-P启用 perl 正则表达式,允许我们使用诸如\K等功能。
-o只打印匹配的部分而不是整行。

\b确保version从单词边界开始,并且我们不匹配诸如abcversion.
\s代表任何类型的空白。
\K让我们grep忘记,它匹配之前的部分\K。被遗忘的部分将不会被打印。
.*?匹配尽可能少的字符(匹配部分将被打印)......
(?=")直到我们看到 a ",它也不会包含在匹配中(这称为前瞻)。

并非所有grep实现都支持该-P选项。或者,您可以使用perl,如本答案所述

perl -nle 'print $& if m{\bversion\s*=\s*"\K.*?(?=")}' yourFile
Run Code Online (Sandbox Code Playgroud)