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(Basic Regular Expressions)를 사용합니다. BRE에서 캡처링 그룹은 \(-> 캡처링 그룹의 시작 \)-> 캡처링 그룹의 끝 으로 언급됩니다 .
  • [^ ]*모든 문자와 일치하지만 공백 문자는 0번 이상 일치하지 않습니다.
  • 따라서 결합된 형식은 \([^ ]*\)0개 이상의 공백이 아닌 문자를 캡처합니다. 이것이 첫 번째 단어입니다.
  • 공백과 일치합니다.
  • \([^:]*\)모든 문자를 캡처하지만 :0회 이상은 캡처하지 않습니다.
  • 교체 부분에서는 그룹 인덱스 2를 첫 번째로, 인덱스 1을 두 번째로 참조합니다. 일치하는 항목이 반대 형식으로 인쇄됩니다.

펄을 통해,

perl -pe 's/^(\S+)\s([^:]+)/\2 \1/' file

관련 정보