複数の名前が入ったテキスト ファイルがあり、名前が最初に、姓が 2 番目に並んでいます。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 では、キャプチャ グループは-> キャプチャ グループの開始、\)
-> キャプチャ グループの終了で示されます。[^ ]*
スペース文字を除く任意の文字に 0 回以上一致します。- したがって、結合された形式では、
\([^ ]*\)
スペース以外の文字が 0 個以上含まれる文字列が取得されます。これが最初の単語です。 スペースに一致します。
\([^:]*\)
任意の文字をキャプチャしますが、:
0 回以上はキャプチャしません。- 置換部分では、グループ インデックス 2 を最初、インデックス 1 を 2 番目として参照します。これにより、一致したものが逆の形式で印刷されます。
Perlを通じて、
perl -pe 's/^(\S+)\s([^:]+)/\2 \1/' file