我有一个文本文件,其中有几个名字,名字排在第一位,姓氏排在第二位。如何使用 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)
通过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 中,捕获组通过\(-> 捕获组的开始,\)-> 捕获组的结束来提及。[^ ]* 匹配任何字符但不匹配空格字符零次或多次。\([^ ]*\)将捕获字符串零个或多个非空格字符。这是第一个字。 匹配一个空格。\([^:]*\)捕获任何字符,但不是:零次或多次。通过 Perl,
perl -pe 's/^(\S+)\s([^:]+)/\2 \1/' file
Run Code Online (Sandbox Code Playgroud)