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