パターンの前後の行の一部を別々に処理する 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内でを実行する方法があれば、 でフィールド区切り文字として (ハイフン)awkを設定し、 で を実行してから、 を使用して行全体を印刷します。-awksed 's/../&:/g;s/:$//'$2print $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

末尾の 16 進数が常に 8 文字であると仮定します。

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

関連情報