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)
基本上,我需要帮助...
预期产量:
select me
and me
select me
also me
Run Code Online (Sandbox Code Playgroud)
这是在中执行此操作的方法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)