2014-11-22 50 views
2

我有一个包含以下行文件:使用正则表达式来解析在bash分隔阵列

<polyline id="graph" points="0,287 100,470 200,509 300,459 400,471"/>

,我需要提取以下值:

287 470 509 459 471

我我目前在使用此代码:

grep -oP '(?<=points=").*(?="/>)' "file.svg" | grep -oP '(?<=,)[[:digit:]]*'

我想用一个grep来做,我试过用(?:),但没有成功。有什么建议么?

回答

2

一个sed的解决方案可以像

$ sed -r '/points=/ s/[^,]+,?([0-9]*)/\1 /g' input 
287 470 509 459 471 

OR

为更好的操控

$ sed -r '/points=/ s/.*points=("[^"]+").*/\1/g; s/[^,]+,?([0-9]*)/\1 /g' input 
287 470 509 459 471 
+1

嗯,如果线是这样的:''then then sed produce:'2,4 287 470 509 459 471' – anubhava 2014-11-22 16:06:23

+0

@anubhava我已经添加了,以及包括。希望那里不会有更多的漏洞;) – nu11p01n73R 2014-11-22 16:14:32

1

如果你只是解析这样的单行线,你也许可以侥幸逃脱使用XML::Simple,如下所示:

perl -MXML::Simple -lwe'$x = XMLin(<>); print $x->{points};' file.svg 

伴您行,这给了我下面的输出:

0,287 100,470 200,509 300,459 400,471 

$x整个结构从该行解析看起来像这样印刷时Data::Dumper

$VAR1 = { 
      'points' => '0,287 100,470 200,509 300,459 400,471', 
      'id' => 'graph' 
     }; 

请注意,您可能需要预处理您的输入,如果它比您在问题中指出的更复杂。

+1

我忘了提及该平台上没有'perl'。我标记了它,因为'-P'开关... – Ulrik 2014-11-22 14:28:28

1

它是XML,所以像XML一样解析。

use XML::Twig; 
my $twig = XML::Twig -> new -> parse ('<polyline id="graph" points="0,287 100,470 200,509 300,459 400,471"/>'); 
print $twig -> root -> {'att'} -> {'points'}; 

虽然 - 你可能需要的东西,如果你想解析出来一个SVG文件的略有不同 - 但你可以使用$twig -> parsefile

简化为一个班轮:

perl -MXML::Twig -e 'print XML::Twig -> new -> parsefile ("test.xml") -> root -> first_child("polyline") -> {"att"}{"points"};' 
1

可以使用的GNU AWK:

awk -v RS='points="[^"]+"' 'RT{s=RT; gsub(/[^[:digit:], ]|[[:digit:]]+,/, "", s); 
    print s}' file 
287 470 509 459 471 
0

awk应该做的:

awk -F\" '/points/ {gsub(/[0-9]+,/,"",$4);print $4}' file 
287 470 509 459 471 

如果上线的位置做改变,请执行:

awk -F"points=" 'NF==2{gsub(/[0-9]+,|[^0-9 ]/,"",$2);print $2}' file 
287 470 509 459 471