我有一個包含多個名稱的文字文件,這些名稱排列為“名”在前,“姓氏”在後。如何使用 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