2016-08-17 16 views
0

テストで実行された連続した(改行で区切られていない)リストの文字列があります。形式で出力されます。linuxの文字列からパターンを抽出する方法

<execution time> s -----> <Testcase name><optionally:[Parameters used by test]> <execution time> s ... <Testcase name> 

例:

1.2 s -----> Testa[0. param1] 2.4 s -----> Testb 3 s -----> Testc 

これは私に、各テストの実行時間を与えます。

問題を抽出することは、スペースと割り当て時間= split [i]とtestcase = split [i + 3]を使用して分割できないということです(Testaの場合と同様に、

各期間の始めに新しい行を追加して、時間とテストケース名だけを抽出できます。

私は

sed -r 's/^[^0-9]*([0-9]+).*/\1/' /tmp/tmp 

を実行して時刻を取得することを試みたが、私はSED -rをサポートしていないのMacOSを使用しています。

撮影した時間と文字列から対応するテストケース名を抽出するより良い方法はありますか?

提供例えば、出力形式のものとすることができる。

1.2,Testa[0. param1] 

2.4,Testb 

3,Testc 

PS:私は、入力ファイルのパターン

+0

[編集ヘルプ](http://stackoverflow.com/editing-help)をご覧ください。 – Cyrus

+2

あなたの入力の一例は、想像力の広がりではなく、入力が取ることができるフォーマットの仕様であり、仕様は私たちが必要とするものです。完全な仕様がない場合は、少なくともコーナーケースをカバーする幅広い例を考え出すことができます。 –

+0

2.修正ありがとうございました! –

答えて

2
re='([[:digit:].]+ s) ----->([^>]*)(>(.*))?$' 

s='1.2 s -----> Testa[0. param1] 2.4 s -----> Testb 3 s -----> Testc' 

while [[ $s =~ $re ]]; do   # apply POSIX ERE in $re to string in $s 
    curr_time=${BASH_REMATCH[1]}  # first match group is curr_time 
    curr_name=${BASH_REMATCH[2]}  # second match group is curr_name 
    curr_name=${curr_name%' -----'} # strip trailing dashes from curr_name 
    curr_name=${curr_name% * s}  # strip time of next item from curr_name 
    echo "${curr_time% s},$curr_name" # emit output 
    s="${BASH_REMATCH[2]}${BASH_REMATCH[3]}" # strip completed content from string 
done 

を変更傾ける...あなたの与えられた入力と、放出します: Dを破る

1.2 s Testa[0. param1] 
2.4 s Testb 
3 s Testc 

その成分に正規表現([[:digit:].]+ s) ----->([^>]*)(>(.*))?$を所有:

  • ([[:digit:].]+ s)BASH_REMATCH[1]を移入する最初のマッチグループを定義します。少なくとも1つの数字またはピリオドと一致し、スペースとそれに続くsが続きます。
  • ----->は、リテラル文字列と一致します。
  • ([^>]*)の前にと一致し、次の>と一致し、BASH_REMATCH[2]を形成する。ここからテストの名前を抽出します。
  • は、リテラル>と、行の最後まで残っている他のコンテンツと一致し、未処理のコンテンツがループを介して次の繰り返しのためにキャプチャされるようにします。
+0

これはうまくいきました!本当にありがとう。これを説明してもらえますか? –

+0

コードにコメントを追加しました。それ以上の説明が必要な場合は、明確ではないものを詳細に記述できますか? –

1

は、私は本当にPerlのには専門家だが、PCREはlookahead(?=...)機能があります事(先読み)を見て、時間が続く場合

$ perl -ne 's/ ----->/,/g; s/ (?=[0-9](\.[0-9])* s)/\n/g;print' file 
1.2 s, Testa[0. param1] 
2.4 s, Testb 
3 s, Testc 
  • s/ ----->//g
  • s/ (?=[0-9](\.[0-9])* s)/\n/gは、スペースを置き換えたものarrowy鮫を削除します
1

3番目のargをマットにするGNU awk ch():

$ cat tst.awk 
BEGIN { OFS="," } 
{ 
    cnt = 0 
    gsub(/----->/,"\n") 
    while (match($0,/\s*([0-9.]+) s \n ([^\n]+)$/,a)) { 
     flds[++cnt] = a[1] OFS a[2] 
     $0 = substr($0,1,RSTART-1) 
    } 
    for (i=cnt; i>0; i--) { 
     print flds[i] 
    } 
} 

$ awk -f tst.awk file 
1.2,Testa[0. param1] 
2.4,Testb 
3,Testc 
関連する問題