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