选择括号之间的逗号分隔值

tst*_*tev 2 regex linux awk grep

给出以下简化的示例文本;

not me G(select me, and me)
G(select me) G(also me)
Run Code Online (Sandbox Code Playgroud)

使用regex表达式我想选择之间的所有内容G(...)作为单独的结果,即使有例如逗号也是如此。基于此处的不同答案,是我的第一次尝试。

G\(([^)]+)\)
Run Code Online (Sandbox Code Playgroud)

非常适合第二行,但不适用于第一行。我的第二次尝试是基于其他一些答案,以便从逗号分隔的列表中选择值。

G\(([^),]+)
Run Code Online (Sandbox Code Playgroud)

另一种尝试在此基础上SO,和另一个在此基础上SO

基本上,我需要帮助...

预期产量:

select me
and me
select me
also me
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 6

这是在中执行此操作的方法gnu awk。这看起来更冗长,但使用的是相当简单的正则表达式,它不依赖于以下实验PCRE正则表达式选项gnu grep

s="G(also me1) not me G(select me, and me) G(select me) G(also me)"
awk '{ 
   while ( match($0, /\<G\(([^)]*)\)(.*)/, a) ) {
      gsub(/ *, */, "\n", a[1])
      print a[1]
      $0 = a[2]
   }
}' <<< "$s"
Run Code Online (Sandbox Code Playgroud)

also me1
select me
and me
select me
also me
Run Code Online (Sandbox Code Playgroud)

基于下面的Ismail注释,如果我们想使其符合POSIX,则使用此awk命令(由于无法使用单词边界或\<在POSIX / BSD awk中):

awk '{
   while ( match($0, /(^|[[:blank:]])G\([^)]*\)/) ) {
      m=substr($0, RSTART+2, RLENGTH-3)
      sub(/^\(/, "", m)
      gsub(/ *, */, "\n", m)
      print m
      $0=substr($0, RSTART+RLENGTH)
   }
}' <<< "$s"
Run Code Online (Sandbox Code Playgroud)

  • 我对此很清楚,并且因为OP使用了标签linux,所以答案没有要求POSIX ERE。 (3认同)
  • 要使其在POSIX / BSD awk上运行,应为:`awk'{while(match($ 0,/(^ | [^ _ [:alnum:]])G \([^)] * \)/))) {m = substr($ 0,RSTART + 2,RLENGTH-3); sub(/ ^ \(/,“”,m); gsub(/ *,* /,“ \ n”,m);打印m; $ 0 = substr($ 0,RSTART + RLENGTH)}}'&lt;&lt; &lt;&lt; $ s” (3认同)