我有一个文本文件,里面有多个名字,名字排在最前面,姓氏排在后面。如何使用 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