편집 1

편집 1

16진수와 임의의 문자열이 포함된 파일이 있습니다 ~/dummy_hex.txt.

\x12\xA1\xF1\xE3somegibberigh

위의 문자열에 16진수 값(\x^hex_digit^^hex_digit^ 그룹)이 몇 개 있는지 세어보고 싶습니다. 위의 예에서는 number 를 반환하는 명령을 실행하고 싶습니다 4.

즉, 터미널에 다음을 입력하고 싶습니다.

command ^file_having hex^

값 4를 반환합니다.

지금까지 나는 이것을 시도했습니다 :

sed 's/[^\x[0-9A-Fa-f][0-9A-Fa-f]]//g' dummy_hex.txt | awk '{ print length }'

하지만 어떻게든 잘못된 정규식 유형으로 인해 잘못된 결과를 반환하는 것 같습니다. sed와 함께 전체 PCRE 호환 정규식을 사용하여 이 작업을 수행하는 방법을 알려주실 수 있나요?

또는 내 문자열에 포함된 16진수 값이 몇 개인지 계산하고 싶습니다.

편집 1

대안은 \x문자열의 발생 횟수를 계산하는 것이지만 이 방법은 \x16진수 문자열을 나타내지 않을 수 있는 뒤에 있는 가짜 값을 계산할 가능성이 높습니다.

 sed 's/[^\x]//g' dummy_hex.txt | awk '{ print length }'

-r또한 PCRE를 활성화하는 옵션을 사용하여 이 작업 을 시도했습니다 .

 sed -r 's/^\\x[0-9A-Fa-f][0-9A-Fa-f]]/g' dummy_hex.txt | awk '{ print length }'

하지만 오류가 발생합니다.

sed: -e 표현식 #1, 문자 31: 종료되지 않은 's' 명령

답변1

grep확장 정규식 및 -o옵션 에 대한 지원을 사용합니다 .

grep -Eo '\\x[[:xdigit:]]{2}' input | wc -l

다음 요구 사항을 충족하려면 command filename:

function counthex() {
  grep -Eo '\\x[[:xdigit:]]{2}' "$1" | wc -l
}

처럼:

counthex input

답변2

$ cat input
bla\x12\xA1\xF1
\xE3bla
$ perl -nle '$c++ while m/\\x[[:xdigit:]]/g; END { print $c }' input
4
$ 

기본적으로 입력( perldoc perlrun)을 인쇄하지 않고 반복하고 일치하는 항목마다 카운터를 증가시킨 다음 해당 개수를 인쇄합니다.

답변3

16진수 없이 문자를 계산하는 경우:

$ sed 's/\([^\]*\)\\x[0-9A-Fa-f][0-9A-Fa-f]/\1/g' dummy_hex.txt | LC_ALL=C wc -c
14

전체 파일 수에서 해당 값을 뺍니다.

$ <dummy_hex.txt wc -c
30

16진수 문자 수(4를 곱함)를 얻을 수 있습니다. 스크립트에서:

#!/bin/bash
a=$(sed 's/\([^\]*\)\\x[0-9A-Fa-f][0-9A-Fa-f]/\1/g' dummy_hex.txt | wc -c)
b=$(<dummy_hex.txt wc -c )
count=$(( (b-a)/4 ))
echo "$count"

인쇄:

$ ./script
4

wc는 바이트 수를 계산합니다(로케일 종속 문자가 아님).

답변4

또 다른 해결책은 설치된 Perl을 사용하여 이 작업을 수행하는 것입니다.

perl -lne 'print my $c = () = /\\x[[:xdigit:]]+/' dummy_hex.txt

이는 스크립트를 작성하고 싶지 않은 경우(예: 실행할 명령이 포함된 지침 시트) 빠르고 쉬운 한 줄을 제공합니다.

관련 정보