Сценарий Sed - Инвертирующие имена

У меня есть текстовый файл с несколькими именами, которые расположены с Именем сначала и второй Фамилией. Как я могу использовать 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
2
задан 18 October 2014 в 21:07

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 (Основные Регулярные выражения). В BRE группы фиксации упоминаются \(-> запускаются группы фиксации, \) -> конец группы фиксации.
  • [^ ]* Соответствия любой символ, но не нуля пробела или больше раз.
  • Так объединенная форма \([^ ]*\) получил бы строковый нуль или больше непробелов. Это - первое слово.
  • Соответствует пространству.
  • \([^:]*\) Получения любой символ, но не : нуль или больше раз.
  • В сменной детали отошлите индекс 2 группы настолько же сначала и индекс 1 как второй. Так, чтобы подобранный был бы распечатан в обратной форме.

Через Perl,

perl -pe 's/^(\S+)\s([^:]+)/\2 \1/' file
9
ответ дан 6 October 2019 в 23:07

Другие вопросы по тегам:

Похожие вопросы: