[英]Select comma separated values between parentheses
这是在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.