grep을 사용하여 주어진 범위의 16진수 행을 반환하는 방법은 무엇입니까?

grep을 사용하여 주어진 범위의 16진수 행을 반환하는 방법은 무엇입니까?

있다면 다음과 같이 말해주세요:

blah;PC=1234abcd
PC=4444bbcd;blah
PC=0000abcd;;foo
PC=1234abff

PC 값이 주어진 범위 (예: ) grep내에 있는 행을 어떻게 처리할 수 있습니까 ?1234ab001234b0ff

범위 -옵션은 일반 순서에서만 작동하는 것으로 보이며 0-9a-A16진수 범위에서는 작동하지 않습니다.

답변1

grep -f <(printf "%x\n" $(seq -f "%.f" $(printf "%d %d" 0x1234ab00 0x1234b0ff))) file
  • printf두 개의 16진수 값 중 10진수 값을 내부적으로 인쇄합니다.
  • 그런 다음 seq그 사이의 모든 것을 십진수로 인쇄하십시오.
  • printf이러한 모든 10진수 값의 16진수 값을 외부적으로 인쇄합니다.
  • 마지막 검색 grep -f에서 이러한 패턴이 모두 나타납니다 file.

산출:

blah;PC=1234abcd
PC=1234abff

답변2

나는 다음을 사용할 것이다 perl:

perl -ne 'print if /PC=([\da-fA-F]+)/ &&
                   ($n=hex $1) >= 0x1234ab00 &&
                    $n <= 0x1234b0ff'

를 사용하면 grep매우 번거로울 수 있으며 다음과 같이 각 범위에 대한 정규식을 조정해야 합니다.

LC_ALL=C grep -E 'PC=0*1234([aA][b-fB-F]|[bB]0)[0-9a-fA-F]{2}([^0-9a-fA-F]|$)'

대괄호 표현식 내의 범위는 문자에만 적용됩니다. 대괄호 표현식은 하나만 일치합니다.특징(좋아요, 요소를 정리하세요). C 로케일에서는 [0-9]의 약어 [0123456789]이므로 10개의 아라비아 숫자 문자와 일치합니다. [0-25]이는 [0125]0, 1, 2, 5 중 하나와 일치합니다.

관련 정보