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

相關內容