sed para insertar dos puntos en una dirección mac

Tengo una lista de direcciones mac en este formato:

412010000018
412010000026
412010000034

Quiero esta salida:

41:20:10:00:00:18
41:20:10:00:00:26
41:20:10:00:00:34

Intenté esto, pero no funcionó:

sed 's/([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1:\2:\3:\4/g' mac_list

¿Cómo debería hacerlo?

preguntado el 12 de junio de 12 a las 07:06

Una dirección mac está en formato hexadecimal y no solo numérico. -

Una vez que empiezo a trabajar con el formato numérico básico, también puedo agregar expresiones regulares alfabéticas:

5 Respuestas

Esto podría funcionar para usted (GNU sed):

sed 's/..\B/&:/g' file

Respondido el 12 de junio de 12 a las 13:06

Esto es lo que funcionó para mí

sed 's/\(..\)/\1:/g;s/:$//' file

Respondido 08 ago 14, 18:08

Tienes que usar el correcto sed sintaxis:

\{I\}
     matches exactly I sequences (I is a decimal integer;
     for portability, keep it between 0 and 255 inclusive).

\(REGEXP\)
     Groups the inner REGEXP as a whole, this is used for back references.

Aquí hay un comando de ejemplo que cubre los primeros 2 campos

     sed 's/^\([0-9A-Fa-f]\{2\}\)\([0-9A-Fa-f]\{2\}\).*$/\1:\2:/'

El siguiente comando puede procesar una dirección MAC completa y es fácil de leer:

 sed -e 's/^\([0-9A-Fa-f]\{2\}\)/\1_/'  \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1_/' \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1_/' \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1_/' \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1_/' \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1/'

Siguiendo la idea de una solución perl publicada aquí por @Qtax con sustituciones globales, se puede obtener una solución más corta:

 sed -e 's/\([0-9A-Fa-f]\{2\}\)/\1:/g' -e 's/\(.*\):$/\1/'

Respondido el 12 de junio de 12 a las 08:06

Ejemplo de Perl:

perl -pe 's/(\b|\G)[\da-f]{2}(?=[\da-f]{2})/$&:/ig' file

Si el archivo solo tiene direcciones MAC, podría simplificarse a:

perl -pe 's/\w{2}\B/$&:/g' file

Respondido el 12 de junio de 12 a las 08:06

If awk es una solución aceptable:

awk 'BEGIN { FS= "" }
{ for (i=1; i<=length($0) ; i++) {
      if (i % 2 == 0) { macaddr=macaddr $i ":" } 
      else { macaddr = macaddr $i }
  }
  print gensub(":$","","g",macaddr)
  macaddr=""
}' INPUTFILE

lo hace bien. Aquí puedes verlo en acción..

Respondido el 12 de junio de 12 a las 08:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.