Sed Script - Invertendo nomes

2

Eu tenho um arquivo de texto com vários nomes que são organizados primeiro com o primeiro nome e com o segundo sobrenome. Como posso usar Sed para reverter essa ordem de nomes para que o Sobrenome seja o primeiro e o Nome seja o último?

Por exemplo, eu 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 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
    
por Justin 18.10.2014 / 18:54

1 resposta

9

Através do sed

$ sed 's/^\([^ ]*\) \([^:]*\)/ /' 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 começo.
  • \(...\) Uso padrão do 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.
  • Assim, o formulário combinado \([^ ]*\) capturaria a cadeia zero ou mais caracteres não espaciais. Essa é a primeira palavra.
  • Corresponde a um espaço.
  • \([^:]*\) Captura qualquer caractere, mas não : zero ou mais vezes.
  • Na peça de substituição, consulte o índice do grupo 2 como primeiro e o índice 1 como segundo. Para que o correspondido seja impresso de forma invertida.

Através do Perl,

perl -pe 's/^(\S+)\s([^:]+)/ /' file
    
por Avinash Raj 18.10.2014 / 19:09