Команда Linux для обработки части строки до и после шаблона по-разному

Команда Linux для обработки части строки до и после шаблона по-разному

Мой оригинальный текст

11  2   CDTZ - b00264ab
36  37  CDTB - c2330001

Я хочу, чтобы выводимый текст выглядел так:

11  2   CDTZ - b0:02:64:ab
36  37  CDTB - c2:33:00:01

Мне нужно добавить двоеточие после каждых двух символов в строке, следующей за дефисом.

Есть ли какая-то общая команда обработки текста, которой я могу дать указание

  1. Все строки до дефиса (и включая его) должны быть нетронутыми.
  2. Вставляйте двоеточие после каждых двух символов, следующих за дефисом.

В общем случае мне приходится обрабатывать текст до и после шаблона (в данном случае дефиса) по-разному.

Мои усилия на данный момент:

  • У меня есть базовые знания sedи awk.
  • Если бы был способ сделать это sedвнутри , awkто я бы установил -(дефис) в качестве разделителя полей awkи выполнил бы sed 's/../&:/g;s/:$//'on $2, а затем вывел бы всю строку с помощью print $0.

решение1

Попробуй это,

awk -v OFS='\t' '{gsub(/../,"&:",$NF); sub(/:$/,"",$NF);}1' file
11  2   CDTZ    -   b0:02:64:ab
36  37  CDTB    -   c2:33:00:01
  • gsub(/../,"&:",$NF)добавит завершающий символ :к каждой паре или символу.
  • sub(/:$/,"",$NF)удалит ненужное :в конце последнего поля, которое было добавлено предыдущимgsub

решение2

Предположим, что шестнадцатеричное число в конце всегда состоит из восьми символов:

$ sed 's/\(..\)\(..\)\(..\)\(..\)$/\1:\2:\3:\4/' file
11      2       CDTZ    -       b0:02:64:ab
36      37      CDTB    -       c2:33:00:01

Связанный контент