Sed Script - Invertir nombres

Sed Script - Invertir nombres

Tengo un archivo de texto con varios nombres organizados con el nombre primero y el apellido segundo. ¿Cómo puedo usar Sed para invertir este orden de nombres de modo que el apellido sea el primero y el nombre sea el último?

Por ejemplo, tengo líneas como las de abajo.

Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400

Me gustaría que se parecieran

Blenheim Steve:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Boop Betty:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Chevsky Igor:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400

Respuesta1

A través de sed,

$ sed 's/^\([^ ]*\) \([^:]*\)/\2 \1/' file
Blenheim Steve:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Boop Betty:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Chevsky Igor:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400

Explicación:

  • ^Afirma que estamos al principio.
  • \(...\)El sed predeterminado utiliza BRE (Expresiones regulares básicas). En BRE, los grupos de captura se mencionan mediante \(-> inicio de un grupo de captura, \)-> final de un grupo de captura.
  • [^ ]*Coincide con cualquier carácter pero no con carácter de espacio cero o más veces.
  • Entonces, la forma combinada \([^ ]*\)capturaría la cadena con cero o más caracteres que no sean espacios. Esa es la primera palabra.
  • Coincide con un espacio.
  • \([^:]*\)Captura cualquier personaje pero no de :cero o más veces.
  • En la pieza de repuesto, haga referencia al grupo índice 2 como primero y al índice 1 como segundo. De modo que las coincidencias se imprimirían en forma invertida.

A través de Perl,

perl -pe 's/^(\S+)\s([^:]+)/\2 \1/' file

información relacionada