임의 길이의 16진수 문자열에서 문자 1과 2, 3과 4 등을 자동으로 바꾸려고 합니다.
예:
A627E39B
이 되다:
6A723EB9
이는 sed나 다른 *nix 텍스트 유틸리티 중 하나를 사용하여 가능할 것으로 보이지만 지금까지 어떤 예제도 찾지 못했습니다.
답변1
역참조를 사용할 수 있습니다.
echo A627E39B | sed 's/\(.\)\(.\)/\2\1/g'
그러면 두 문자가 모두 나타나는 것을 찾아 서로 바꿉니다.
~처럼글렌 잭맨확장된 정규식을 활성화한다고 지적했습니다(-E
toybox
sed
GNU, 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
이 문제를 해결할 수 있습니다(또는 개행을 추가하지 않고 사용). 출력을 화면에 표시하는 경우 완전성을 위해 끝에 줄바꿈을 추가해야 합니다.echo
printf
% 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