Linux-Befehl, um einen Teil der Zeile vor und nach einem Muster unterschiedlich zu verarbeiten

Linux-Befehl, um einen Teil der Zeile vor und nach einem Muster unterschiedlich zu verarbeiten

Mein Originaltext ist

11  2   CDTZ - b00264ab
36  37  CDTB - c2330001

Ich möchte, dass der Ausgabetext wie folgt angezeigt wird:

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

Ich muss für die Zeichenfolge, die auf den Bindestrich folgt, nach jeweils 2 Zeichen einen Doppelpunkt hinzufügen.

Gibt es einen allgemeinen Textverarbeitungsbefehl, dem ich das zuweisen kann?

  1. Alle Zeichenfolgen vor (und einschließlich) dem Bindestrich sollten unverändert bleiben.
  2. Fügen Sie nach jeweils 2 Zeichen nach dem Bindestrich einen Doppelpunkt ein.

Generell muss ich Text vor und nach einem Muster (hier Bindestrich) unterschiedlich verarbeiten.

Meine bisherigen Bemühungen:

  • Ich verfüge über Grundkenntnisse in sedund awk.
  • Wenn es eine Möglichkeit gäbe, dies sedinnerhalb eines zu tun, würde ich (Bindestrich) als Feldtrennzeichen in awkfestlegen und dies auf tun und dann die ganze Zeile mit drucken .-awksed 's/../&:/g;s/:$//'$2print $0

Antwort1

Versuche dies,

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)fügt :jedem Paar oder Zeichen ein Ende hinzu.
  • sub(/:$/,"",$NF)entfernt das Unerwünschte :am Ende des letzten Feldes, das durch vorheriges Hinzufügen hinzugefügt wurdegsub

Antwort2

Unter der Annahme, dass die Hexadezimalzahl am Ende immer acht Zeichen lang ist:

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

verwandte Informationen