comando de Linux para procesar parte de la línea antes y después de un patrón de manera diferente

comando de Linux para procesar parte de la línea antes y después de un patrón de manera diferente

Mi texto original es

11  2   CDTZ - b00264ab
36  37  CDTB - c2330001

Quiero que el texto de salida aparezca como

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

Tengo que agregar dos puntos después de cada 2 caracteres para la cadena que sigue al guión.

¿Existe algún comando de procesamiento de texto común al que pueda indicarle?

  1. Toda la cadena antes (e incluyendo) del guión debe estar intacta.
  2. Inserte dos puntos después de cada 2 caracteres que siguen al guión.

En general, tengo que procesar el texto antes y después de un patrón (guion aquí) de manera diferente.

Mis esfuerzos hasta ahora:

  • Tengo conocimientos básicos de sedy awk.
  • Si hubiera una manera de hacerlo seddentro de an, awkentonces establecería -(guión) como separador de campo awky lo haría sed 's/../&:/g;s/:$//', $2luego imprimiría toda la línea usando print $0.

Respuesta1

Prueba esto,

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)agregará un final :a cada pareja o personaje.
  • sub(/:$/,"",$NF)eliminará lo no deseado :al final del último campo agregado por el anteriorgsub

Respuesta2

Suponiendo que el número hexadecimal al final sea siempre de ocho caracteres:

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

información relacionada