Sed 脚本 - 反转名称

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

答案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

相关内容