我有一个文件,其中有一行说明
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)
    以下命令打印包含在 中的字符串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)