从字符串中提取一个或多个模式

从字符串中提取一个或多个模式

我有一些看起来像这样的行:

function( "((2 * VAR(\"xxx\")) - VAR(\"yyy\"))" ?name "name" ?plot t ?save t ?evalType 'point)
function("value(res VAR(\"zzz\"))" ?name "othername" ?plot t ?save t ?evalType 'point)

而且,我想找到一个命令来输出 VAR 函数中定义的字符串,即:

xxx yyy
zzz

我已经尝试过,sed但据我了解,我无法以非贪婪的方式做到这一点。

答案1

如果您有grep支持 Perl 兼容正则表达式 (PCRE) 的程序,那么您可以使用

grep -Po 'VAR\(\\"\K[^\\]*'

或者(更对称 - 使用lookbehind和lookahead)

grep -Po '(?<=VAR\(\\").*?(?=\\")'

前任。

$ grep -Po 'VAR\(\\"\K[^\\]*'
function( "((2 * VAR(\"xxx\")) - VAR(\"yyy\"))" ?name "name" ?plot t ?save t ?evalType 'point)
function("value(res VAR(\"zzz\"))" ?name "othername" ?plot t ?save t ?evalType 'point)
xxx
yyy
zzz

前任。

$ grep -Po '(?<=VAR\(\\").*?(?=\\")'
function( "((2 * VAR(\"xxx\")) - VAR(\"yyy\"))" ?name "name" ?plot t ?save t ?evalType 'point)
function("value(res VAR(\"zzz\"))" ?name "othername" ?plot t ?save t ?evalType 'point)
xxx
yyy
zzz

答案2

我想你想要一个像 grep 这样的正则表达式。类似的东西grep 'VAR\("[A-z0-9]*"\)'但是,在您的情况下,所有这些 \" 都不起作用。也许是这样的grep '(^VAR(\")[A-z0-9](^\"))' | grep 'VAR\(\\"[A-z0-9]*\\"\)'

我也没有使用 grep 太久了。 :)

相关内容