Sed Script - Invertendo nomes

Sed Script - Invertendo nomes

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

informação relacionada