Sed 腳本 - 反轉名稱

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

答案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

相關內容