对于下面的问题,我尝试了许多grep
/ egrep
, awk
,cut
命令,但没有运气。
我有一个只有一条长行的文件(以下只是示例)。我们想grep
从下面的文件内容下面的模式:
印刷图案:
o.buildVersion="2.5.1.162"
Run Code Online (Sandbox Code Playgroud)
注意- 2.5.1.162
是未知部分,我只知道o.buildVersion
存在。
文件内容:
t(t,n){var o=e.call(this,t,n,C.a.FRAMEWORKIDENTIFIER)||this;return o._logger=n,o.resourceBasePath="",o.buildVersion="2.5.1.162".replace(/(\.(?=[^.]*$))(.+)/,""),o.resourceBasePath=t.Cluster.UTIL.getResourceBasePath(),o}return W(t,e),t.prototype.ngOnInit=function(){this._logger.trace("Inside AboutUsComponent!")},t.prototype.ngOnDestroy=function(){this.dispose()},t=X([Object(l.d)({selector:"ignio-about-us",template
Run Code Online (Sandbox Code Playgroud)
如果您grep
支持非标准-o
和-P
选项,您应该能够使用:
grep -Po '\bo.buildVersion=".*?"' < your-file
Run Code Online (Sandbox Code Playgroud)
例如,要提取所有o.buildVersion="anything"
不跟随 anum 或下划线的出现,请使用\b
单词边界运算符来避免将其拾取capuccino.buildVersion="mild"
。
如果出现多次,它们将每行打印一个。
要将结果限制为具有至少一个匹配项的第一行中的结果,请添加-m1
(来自 GNU 实现的另一个非标准扩展grep
)。
只在每一行打印第一次出现:
grep -Po '^.*?\K\bo.buildVersion=".*?"'
Run Code Online (Sandbox Code Playgroud)
最后:
grep -Po '^.*\K\bo.buildVersion=".*?"'
Run Code Online (Sandbox Code Playgroud)
两者都可以结合使用-m1
以停止处理第一个匹配行。
只获取版本号:
pcregrep -o1 '\bo.buildVersion="(.*?)"' < your-file
Run Code Online (Sandbox Code Playgroud)
或者:
grep -Po '\bo.buildVersion="\K.*?(?=")' < your-file
Run Code Online (Sandbox Code Playgroud)
-P
用于正则perl
表达式。如果您grep
不支持该选项,您不妨使用真实的东西:
perl -lne 'print $1 for /\bo.buildVersion="(.*?)"/g' < your-file
Run Code Online (Sandbox Code Playgroud)
或者仅针对输入中的第一次出现:
perl -lne 'if (/\bo.buildVersion="(.*?)"/) {print $1; close ARGV}' < your-file
Run Code Online (Sandbox Code Playgroud)
与grep
变体的一个不同之处在于,如果输入中没有匹配项,它将报告失败退出状态。如果您需要,添加它会很简单。