繁体   English   中英

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

[英]Select comma separated values between parentheses

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

not me G(select me, and me)
G(select me) G(also me)

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

G\(([^)]+)\)

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

G\(([^),]+)

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

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

预期输出:

select me
and me
select me
also me

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

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"

also me1
select me
and me
select me
also me

根据下面 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"

使用 GNU grep ,您可以使用

(?:\G(?!^),\s*|\bG\()\K[^(),]+(?=[^()]*\))

请参阅正则表达式演示

细节

  • (?:\\G(?!^),\\s*|\\bG\\() - 前一个匹配的结尾和 a ,后跟 0+ 个空白字符,或者G(没有字母、数字或_对前
  • \\K - 忽略目前匹配的文本
  • [^(),]+ - 除( , ),之外的 1+ 个字符,
  • (?=[^()]*\\)) - 除了()之外,必须有 0+ 个字符,然后是 a )紧接在当前位置的右侧。

在线演示

rx='(?:\G(?!^),\s*|\bG\()\K[^(),]+(?=[^()]*\))'
example="not me G(select me, and me) G(select me) G(also me)"
grep -oP "$rx" <<< "$example"
# Also works with pcregrep: 
# pcregrep -o  "$rx" <<< "$example"

输出:

select me
and me
select me
also me

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM