我的文件有一行陈述
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
答案 0 :(得分:4)
以下命令打印在version = "..."
中引用的字符串:
grep -Po '\bversion\s*=\s*"\K.*?(?=")' yourFile
-P
启用perl正则表达式,允许我们使用\K
等功能。
-o
仅打印匹配的部分而不是整行。
\b
确保version
从字边界开始,我们不匹配abcversion
之类的内容。
\s
代表任何类型的空白
\K
让grep
忘记了它与\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}'