linux命令以不同的方式处理模式之前和之后的部分行

linux命令以不同的方式处理模式之前和之后的部分行

我的原文是

11  2   CDTZ - b00264ab
36  37  CDTB - c2330001

我希望输出文本显示为

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

我必须在连字符后面的字符串每 2 个字符后添加一个冒号。

是否有任何常见的文本处理命令可以指示

  1. 连字符之前(包括连字符)的所有字符串都应保持不变。
  2. 在连字符后面每 2 个字符后插入冒号。

一般来说,我必须以不同的方式处理模式(这里的连字符)之前和之后的文本。

到目前为止我的努力:

  • sed我有和的基本知识awk
  • 如果有办法sed在 an 内部执行操作,awk那么我会将-(连字符) 设置为字段分隔符 inawk并执行 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

相关内容