У меня есть текстовый файл с несколькими именами, которые упорядочены так, что имя идет первым, а фамилия — второй. Как мне использовать 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