Linux

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

  • April 16, 2020

我的原文是

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那麼我會將-(連字元)設置為欄位分隔符awk並執行 sed 's/../&:/g;s/:$//'on $2,然後使用 列印整行print $0

試試這個,

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

假設最後的十六進制數總是八個字元:

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

引用自:https://unix.stackexchange.com/questions/580402