2013-03-04 74 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