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

时间:2017-04-26 20:30:58

标签: regex bash grep

我的文件有一行陈述

version = "12.0.08-SNAPSHOT"

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

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

12.0.08-SNAPSHOT

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

总结一下,给出

version = "12.0.08-SNAPSHOT"
expected output: 12.0.08-SNAPSHOT

并且给出了

version = "12.0.08-RELEASE"
expected output: 12.0.08-RELEASE

3 个答案:

答案 0 :(得分:4)

以下命令打印在version = "..."中引用的字符串:

grep -Po '\bversion\s*=\s*"\K.*?(?=")' yourFile

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

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

并非所有grep实施都支持-P选项。或者,您可以使用perl中所述的perl -nle 'print $& if m{\bversion\s*=\s*"\K.*?(?=")}' yourFile

http.authorizeRequests().antMatchers("/css/**", "/js/**", "/images/**").permitAll();

答案 1 :(得分:2)

似乎是cut的工作:

$ echo 'version = "12.0.08-SNAPSHOT"' | cut -d'"' -f2
12.0.08-SNAPSHOT

$ echo 'version = "12.0.08-RELEASE"' | cut -d'"' -f2
12.0.08-RELEASE

答案 2 :(得分:1)

便携式解决方案:

$ echo 'version = "12.0.08-RELEASE"' |sed -E 's/.*"(.*)"/\1/g'
12.0.08-RELEASE

甚至:

$ perl -pe 's/.*"(.*)"/\1/g'.
$ awk -F"\"" '{print $2}'