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 

通过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中,捕获组由\( – >捕获组的开始, \) – >捕获组的结尾提及。
  • [^ ]*匹配任何字符,但不匹配空格字符零次或多次。
  • 因此组合forms\([^ ]*\)将捕获字符串零个或多个非空格字符。 这是第一个字。
  • 匹配空间。
  • \([^:]*\)捕获任何字符但不包括:零次或多次。
  • 在替换部分中,将组索引2称为第一个,将索引1称为第二个。 这样匹配的将以反转forms打印。

通过Perl,

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