Sed 脚本 - 反转名称

Jus*_*tin 2 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
Run Code Online (Sandbox Code Playgroud)

我希望他们看起来像

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
Run Code Online (Sandbox Code Playgroud)

Avi*_*Raj 9

通过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
Run Code Online (Sandbox Code Playgroud)

解释:

  • ^ 断言我们处于开始阶段。
  • \(...\)默认 sed 使用 BRE(基本正则表达式)。在 BRE 中,捕获组通过\(-> 捕获组的开始,\)-> 捕获组的结束来提及。
  • [^ ]* 匹配任何字符但不匹配空格字符零次或多次。
  • 因此组合形式\([^ ]*\)将捕获字符串零个或多个非空格字符。这是第一个字。
  • 匹配一个空格。
  • \([^:]*\)捕获任何字符,但不是:零次或多次。
  • 在替换部分,将组索引 2 称为第一,将索引 1 称为第二。这样匹配的就会以相反的形式打印出来。

通过 Perl,

perl -pe 's/^(\S+)\s([^:]+)/\2 \1/' file
Run Code Online (Sandbox Code Playgroud)