Eu tenho um arquivo de texto com vários nomes organizados com o nome primeiro e o sobrenome depois. Como posso usar o Sed para inverter essa ordem de nomes para que o Sobrenome seja o primeiro e o Nome seja o último?
Por exemplo, tenho linhas como abaixo
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
Eu gostaria que eles se parecessem
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
Responder1
Através do 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
Explicação:
^
Afirma que estamos no início.\(...\)
O sed padrão usa BRE (Expressões Regulares Básicas). No BRE, os grupos de captura são mencionados por\(
-> início de um grupo de captura,\)
-> fim de um grupo de captura.[^ ]*
Corresponde a qualquer caractere, mas não ao caractere de espaço zero ou mais vezes.- Portanto, a forma combinada
\([^ ]*\)
capturaria a string zero ou mais caracteres não espaciais. Essa é a primeira palavra. Corresponde a um espaço.
\([^:]*\)
Captura qualquer personagem, mas não:
zero ou mais vezes.- Na peça de substituição, consulte o índice de grupo 2 como primeiro e o índice 1 como segundo. Para que a correspondência fosse impressa de forma invertida.
Através do Perl,
perl -pe 's/^(\S+)\s([^:]+)/\2 \1/' file