Sed Script - Изменение имён на обратные

Sed Script - Изменение имён на обратные

У меня есть текстовый файл с несколькими именами, которые упорядочены так, что имя идет первым, а фамилия — второй. Как мне использовать Sed, чтобы изменить порядок имен так, чтобы фамилия была первой, а имя — последней?

Например, у меня есть такие строки:

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

Я бы хотел, чтобы они выглядели так

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

решение1

Через 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

Объяснение:

  • ^Утверждает, что мы находимся в начале.
  • \(...\)По умолчанию sed использует BRE (Basic Regular Expressions). В BRE группы захвата обозначаются \(-> началом группы захвата, \)-> концом группы захвата.
  • [^ ]*Соответствует любому символу, кроме пробела, повторенного ноль или более раз.
  • Таким образом, объединенная форма \([^ ]*\)будет захватывать строку из нуля или более непробельных символов. Это первое слово.
  • Соответствует пробелу.
  • \([^:]*\)Захватывает любой символ, но не :ноль и более раз.
  • В заменяемой части укажите индекс группы 2 как первый, а индекс 1 как второй. Так что сопоставление будет напечатано в перевернутом виде.

Через Perl,

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

Связанный контент