문자열에서 두 문자 쌍의 순서를 바꾸는 방법은 무엇입니까?

문자열에서 두 문자 쌍의 순서를 바꾸는 방법은 무엇입니까?

임의 길이의 16진수 문자열에서 문자 1과 2, 3과 4 등을 자동으로 바꾸려고 합니다.

예:

A627E39B

이 되다:

6A723EB9

이는 sed나 다른 *nix 텍스트 유틸리티 중 하나를 사용하여 가능할 것으로 보이지만 지금까지 어떤 예제도 찾지 못했습니다.

답변1

역참조를 사용할 수 있습니다.

echo A627E39B | sed 's/\(.\)\(.\)/\2\1/g'

그러면 두 문자가 모두 나타나는 것을 찾아 서로 바꿉니다.

~처럼글렌 잭맨확장된 정규식을 활성화한다고 지적했습니다(-Etoybox sedGNU, BSD 또는 s 포함) 괄호를 이스케이프 처리하지 않으려면 다음을 수행하세요.

echo A627E39B | sed -E 's/(.)(.)/\2\1/g'

답변2

dd이 기능을 기본적 으로 지원하는 도구가 있습니다 swab.남서쪽 타일두번째ytes) 변환:

% echo ABCD | dd conv=swab
BADC
0+1 records in
0+1 records out
5 bytes (5 B) copied, 0.000109277 s, 45.8 kB/s

2> /dev/null로그 출력을 삭제하려면 다음을 추가해야 합니다 .

% echo ABCD | dd conv=swab 2> /dev/null
BADC

경고: 짝수 개의 (인쇄 가능한) 문자를 보내면 원하는 대로 거의 이루어집니다. 그러나 인쇄 가능한 문자 수를 홀수로 지정하면 2라고 가정하겠습니다.N+1 — 그런 다음 dd후행 개행 문자를 (2로 취합니다.N+2) 문자를 입력 하고 (2)번째 문자로 바꿉니다.N+1 ) . 그래서,

% echo ABCDE | dd conv=swab 2> /dev/null

보내다

                A B C D E \n

dd, 이것은 당신에게 제공됩니다

                B A D C \n E

백업해 보세요.

BADC
E

끝에 개행을 억제하는 옵션을 지정하여 -n이 문제를 해결할 수 있습니다(또는 개행을 추가하지 않고 사용). 출력을 화면에 표시하는 경우 완전성을 위해 끝에 줄바꿈을 추가해야 합니다.echoprintf

% echo -n ABCDE | dd conv=swab 2> /dev/null; echo
BADCE

% printf "%s" ABCDE | dd conv=swab 2> /dev/null; printf "\n"
BADCE

답변3

다음을 사용할 수도 있습니다 perl.

$ echo A627E39B | perl -CLS -nle 'print map {~~reverse} unpack "(a2)*"'
6A723EB9

관련 정보