16진수를 바꾸는 간단한 명령이 있습니까?
예를 들어, 16진수 숫자가 주어지면 다음과 같습니다.
030201
출력은 다음과 같아야 합니다.
010203
이 rev
명령을 사용하면 다음과 같은 결과를 얻습니다.
102030
고쳐 쓰다
$ bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.20.1
답변1
fold
++ 로 :tac
tr
$ echo 030201|fold -w2|tac|tr -d "\n"
010203
fold
- 2바이트마다 분할tac
- 역방향 고양이tr
- 개행 문자 제거
답변2
시스템에 rev
명령이 있는 경우.
hex=030201
new_hex=$(printf %s "$hex" | dd conv=swab 2> /dev/null | rev)
tac
또는 명령이 있는 경우 tail -r
:
new_hex=$(echo "$hex" | fold -w 2 | tac | paste -sd '\0' -)
그리고 zsh
:
setopt extendedglob
new_hex=${(j[])${(s[]Oa)${hex//(#b)(?)(?)/$match[2]$match[1]}}}
( dd
방법과 마찬가지로: 문자 쌍 교환, 단일 문자 목록으로 분할( s[]
), 역순( Oa
) 및 연결( j[]
)).
또는:
printf -v new_hex '%2$s%1$s' ${(s[]Oa)hex}
POSIX적으로:
new_hex=$(
awk '
BEGIN {
hex = ARGV[1]; l = length(hex)
for (i = 1; i < l; i += 2)
new_hex = substr(hex, i, 2) new_hex
print new_hex
}' "$hex"
)
또는
new_hex=$(echo "$hex" |
sed -e 'G;:1' -e 's/\(..\)\(.*\n\)/\2\1/;t1' -e 's/.//')
그리고 perl
:
new_hex=$(perl -le 'print reverse(shift =~ /../g)' -- "$hex")
답변3
당신은 할 수바이너리로 변환하세요,역방향 바이트, 선택적으로후행 줄 바꿈 제거 rev
<2.24, 다시 변환합니다.
$ xxd -revert -plain <<< 030201 | LC_ALL=C rev | tr -d '\n' | xxd -plain
010203
사용
$ bash --version | head -n1
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.28.2
이것은 실제로아니요문자열에 00
(NUL 바이트) 가 포함되어 있으면 rev
해당 지점의 출력이 잘리거나 0a
(개행)이 포함된 rev
경우 유효합니다.철사전체 출력보다는
답변4
(완전함을 위해)
$ echo 030201 | grep -o .. | tac | paste -sd '' -
010203