2013-03-04 1 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]) '. Я не могу помочь с остальными –

ответ

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

+0

Не могли бы вы объяснить, что означает '1' в конце? – leafei

+0

awk scripts - это серия ' {' ​​} 'операторов, которые оцениваются для каждой записи (строка по умолчанию) во входном файле. Условие по умолчанию - «true», а действие по умолчанию - «печатать текущую запись», поэтому, если вы просто пишете оператор действия типа '{gsub (/../,"&:",$ NF); sub (/: $ /, "")} ', тогда он запускается как отсутствующее условие до того, как предполагается, что оно истинно, и если вы просто пишете константу типа' 1', где должно быть условие, то это истинное условие и поэтому вызывает значение по умолчанию 'print' действие. –

1

Сед решение:

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

Первая замена добавляет: после каждой пары шестнадцатеричных цифр, второй удаляет лишнее двоеточие из первого столбца и конца строки.

+0

Спасибо, но это также заменит символы типа '10H'. – leafei

+0

@leafei: Где вы ожидаете появления символов? – choroba

+0

Последняя колонка. – leafei

0

не лучший, но работает:

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