Regex 使用grep提取两个子字符串之间的字符串

Regex 使用grep提取两个子字符串之间的字符串,regex,unix,grep,Regex,Unix,Grep,以下内容几乎是我想要的,但不是全部: echo 'pie(x=x,labels=c("5.3 %","2.8 %","1.5 %","5.2 %","2.9 %","2.3 %","7.9 %","16.9 %","19.5 %","27.5 %","8.3 %"),main="ChIP",col=c("#445FA2","#EB9D86","#799F7A","#6C527F","#5FA1C1","#E8BB77","#A8C5EF","#FDCDB9","#C6E6B5","#F1D5EE

以下内容几乎是我想要的,但不是全部:

echo 'pie(x=x,labels=c("5.3 %","2.8 %","1.5 %","5.2 %","2.9 %","2.3 %","7.9 %","16.9 %","19.5 %","27.5 %","8.3 %"),main="ChIP",col=c("#445FA2","#EB9D86","#799F7A","#6C527F","#5FA1C1","#E8BB77","#A8C5EF","#FDCDB9","#C6E6B5","#F1D5EE","#B4E1F6"),clockwise=TRUE,border=FALSE,radius=0.9,cex=0.8,init.angle=90,density=100)'|grep -oP '(?<=").*?(?= %)'
请告知如何获得“更清洁”的输出,例如:

5.3
2.8
1.5
5.2
2.9
2.3
7.9
16.9
19.5
27.5
8.3

最好,请基于上述grep-oP解决方案,但当然也欢迎其他解决方案

如果您只需要0-9和。可以使用的字符:

grep -oP '(?<=")[\d\.]*?(?= %)'
而不是

grep -oP '(?<=").*?(?= %)'
注意:Perl中的:\d匹配0-9
. 在Perl中,匹配任何字符,因此您可以将其转义为文字句点字符

简单地将数字与空格匹配就可以获得所需的输出

 grep -oP '[0-9]+.[0-9]+ '
如果小数点和%之间没有空格,也可以这样做

grep -oP '[0-9]+.[0-9]+.*?(?=%)'
扩展为:

…|grep-Eo[0-9]+\[0-9]+

如果您只是查找数字点数字或使用:

…|grep-Eo[0-9]+\[0-9]+|[0-9]+

对于所有可能有点介于之间的数字。

GNU awk解决方案:

s='pie(x=x,labels=c("5.3 %","2.8 %","1.5 %","5.2 %","2.9 %","2.3 %","7.9 %","16.9 %","19.5 %","27.5 %","8.3 %"),main="ChIP",col=c("#445FA2","#EB9D86","#799F7A","#6C527F","#5FA1C1","#E8BB77","#A8C5EF","#FDCDB9","#C6E6B5","#F1D5EE","#B4E1F6"),clockwise=TRUE,border=FALSE,radius=0.9,cex=0.8,init.angle=90,density=100)'

awk -v FPAT='"[0-9]+\\.[0-9]+ %"' '{ for(i=1;i<=NF;i++) { gsub(/[^.0-9]+/,"",$i); print $i } }' <<<"$s"

谢谢为了更一般地捕捉数字中也有字符混音的情况,例如:echo'piex=x,labels=cabc5ui.3%,def2.8%,1.5ghi%,5.2%,2.9%,2.3%,7.9%,16.9%,19.5%,27.5%,8.3%,main=ChIP,col=c445FA2,EB9D86799F7A,6C527F,5FA1C1,E8BB77,A8C5EF,FDCDB9,C6E6B5,F1D5EE,B4E1F6,顺时针=真,边框=假,半径=0.9,cex=0.8,初始角度=90,密度=100’| grep-oP’?非常欢迎你。请注意,可以使用\w替换Perl中的a-zA-Z0-9。由于grep的P选项使用Perl regexp,您可以通过键入:perldoc perlre了解更多信息,尽管我的grep手册页警告说-P是实验性的。非常感谢!例如:grep'pie'EZH2|u 2libsMerged|u posnegMerged|u atPRC2MajorStitchedRegions.R | sed-n 2p | grep-oP |?
s='pie(x=x,labels=c("5.3 %","2.8 %","1.5 %","5.2 %","2.9 %","2.3 %","7.9 %","16.9 %","19.5 %","27.5 %","8.3 %"),main="ChIP",col=c("#445FA2","#EB9D86","#799F7A","#6C527F","#5FA1C1","#E8BB77","#A8C5EF","#FDCDB9","#C6E6B5","#F1D5EE","#B4E1F6"),clockwise=TRUE,border=FALSE,radius=0.9,cex=0.8,init.angle=90,density=100)'

awk -v FPAT='"[0-9]+\\.[0-9]+ %"' '{ for(i=1;i<=NF;i++) { gsub(/[^.0-9]+/,"",$i); print $i } }' <<<"$s"
5.3
2.8
1.5
5.2
2.9
2.3
7.9
16.9
19.5
27.5
8.3