2014-11-22 95 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