2013-03-04 37 views
0

我有類似以下的輸出:插入分號,每2個字節

FA-7E 0 500009730007C118 
FA-8E 0 500009730007C11C 
FA-7F 0 500009730007C158 
FA-10F 0 500009730007C164 

,我想將它翻譯成:

FA-7E 0 50:00:09:73:00:07:C1:18 
FA-8E 0 50:00:09:73:00:07:C1:1C 
FA-7F 0 50:00:09:73:00:07:C1:58 
FA-10F 0 50:00:09:73:00:07:C1:64 

請告知。

+0

在考慮中的正則表達式是'[0-9A-F] {2}(= [0-9A -F])'。我無法幫助其他 – 2013-03-04 11:13:32

回答

2
$ awk '{gsub(/../,"&:",$NF);sub(/:$/,"")}1' file 
FA-7E 0 50:00:09:73:00:07:C1:18 
FA-8E 0 50:00:09:73:00:07:C1:1C 
FA-7F 0 50:00:09:73:00:07:C1:58 
+0

+1你很快! :) – Kent 2013-03-04 11:20:00

+0

你能解釋一下末尾有什麼'1'嗎? – leafei 2013-03-04 11:21:09

+0

awk腳本是一系列' {012}}的語句,它們會針對輸入文件中的每條記錄(默認爲行)進行評估。默認的條件是'true',默認的動作是'打印當前記錄',所以如果你只是寫一個動作語句,比如'{gsub(/../,"&:",$ NF); sub(/ $ /,「」)}'然後在它被認爲是真的之前它被作爲缺失條件執行,並且如果你只是寫一個常量,如條件應該去的'1'那麼這是一個真實的條件,因此調用缺省「印刷」行動。 – 2013-03-04 11:24:48

1

桑達溶液:

sed -e 's/\([0-9A-F]\{2\}\)/\1:/g' -e 's/:\([- ]\|$\)/\1/g' 

第一置換增加:每對十六進制數字之後,第二個去除從第一塔的額外的冒號和線路的端部。

+0

謝謝,但這也會替代像'10H'這樣的字符。 – leafei 2013-03-04 11:24:14

+0

@leafei:你期望角色出現在哪裏? – choroba 2013-03-04 11:26:55

+0

最後一欄。 – leafei 2013-03-04 11:51:24

0

一個Perl變化:

perl -pe 's/\w\w(?=\w+$)/$&:/g' file 
0

不是最好的,但工作原理:

perl -lane 'push @a,$F[2]=~/../g;$F[2]=join ":",@a;undef @a;print "@F"' your_file