bash에서 16 진수를 뒤집으십시오 간단한 명령이 있습니까? 예를 들어, 16

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


답변

당신은 할 수 바이너리로 변환 , 바이트를 역 선택적으로 줄 바꿈 후행 제거 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

문자열에 NUL 바이트가 포함 된 경우 작동 하지 않습니다rev . 그 시점에서 출력이 잘 리기 때문 입니다.


답변

시스템에 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::)).

POSIXly :

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")

답변

fold+ tac+ tr:

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold -2 바이트마다 분할
  • tac -역 고양이
  • tr -개행 제거

답변

perl -nE 'say reverse /(..)/g'

이것은 각각의 16 진 라인을 되돌립니다 :

  • /(..)/g 캡처 한 일치 항목으로 목록을 작성

답변

(완전성을 위해)

$ echo 030201 | grep -o .. | tac | paste -sd '' -
010203

답변

Ipor Sircer의 답변 https://unix.stackexchange.com/a/321867/337458을 기반으로 ~/.bashrc간단하게 호출 할 수있는 멋진 명령을 사용하는 것이 좋습니다 .

function hex_inverse() {
    echo ${1} | fold -w2 | tac | tr -d "\n" ; echo ""
}

$> hex_inverse 030201

010203