2014-10-17 57 views
0

我有這樣的表達式:匹配正則表達式對變量串在Perl/SED/AWK

XX小時,YY分鐘,ZZ S,

XX,YY ZZ或可以是1位或2位。也可能不存在「XX h」或「XX h,YY min」。任何人都可以推薦任何perl或sed表達式來提取XX YY和ZZ?

我試過一些匹配組正則表達式沒有運氣。

感謝

編輯:

例1:12個小時,23分鐘,2秒,

OUTPUT1:12 23 2

例2:3分鐘,59秒,

輸出2:3 59

+2

你能提供示例輸入和預期輸出匹配嗎? – anubhava 2014-10-17 21:03:22

回答

1
echo "12 h, 3 min, 56 s," | tr -cd "0-9 " 

輸出:

12 3 56 

echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/h/ {print $1}' 
echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/min/ {print $1}' 
echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/s/ {print $1}' 
+0

真是令人印象深刻!現在我可以添加到數組並使用它 – paketecuento 2014-10-17 21:25:15

1

試試這個(Perl):

my @matches = "1 h, 30 min, 15 s" =~ /(\d{1,2}) [hms]/g; 

或位嚴格

my @matches = "1 h, 30 min, 15 s" =~ /(\d{1,2}) (?:h|min|s)/g; 

if(scalar @matches == 3) { 
    my ($h, $mi, $s) = @matches; 
    print "$h : $mi : $s\n"; 
} 
1

講起Perl的正則表達式。假設您需要能夠提取以下子字符串:

12 h, 54 min, 11 s, # you have a trailing comma in your example 
1 h, 54 min, 11 s, 
54 min, 11 s, 
4 min, 11 s, 
55 s, 

等等。我們需要一些積木:

\d:任何數字
?:當附加的東西(一個字符,元字符像\d或在括號中的一組),使其可選
():括號內爲分組和提取的值到$1$2
(?:) :用於分組括號而不提取

的秒部分將是\d\d? s,
添加可選的分鐘後,我們會得到(?:\d\d? min,)?\d\d? s,
加了幾個小時後(也可選),我們會得到(?:(?:\d\d? h,)? \d\d? min,)?\d\d? s,
現在,我們將使用周圍的一切該員工括號捕捉比賽拖入$1,我們將最終得到一個正則表達式:

/((?:(?:\d\d? h,)? \d\d? min,)?\d\d? s,)/ 

或者是後面的逗號也是可選?之後只需添加?

如果你需要hmins值,把每\d\d?成一對括號,並檢查$2$3$4

/((?:(?:(\d\d?) h,)? (\d\d?) min,)?(\d\d?) s,)/ 

這不是此任務的最簡便的正則表達式但我只想說明如何從非常簡單的東西開始構建它們,然後向其中添加更復雜的內容。

+0

沒有爲我工作: 'root @ pc:〜#echo「2 min,13 s」| perl -pe's /((?:(?:\ d \ d?h))\ d \ d?min,)?\ d \ d?s,)/ $ 1 /' 2分13秒反正, – paketecuento 2014-10-17 21:23:00

+0

很好解釋。謝謝 – paketecuento 2014-10-17 21:32:55

+0

因爲後面的逗號(你在你的例子中)沒有工作。從正則表達式中刪除最後一個逗號並嘗試:)另外,不要以root身份工作。 – afenster 2014-10-17 21:41:01