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
문자열의 발생 횟수를 계산하는 것이지만 이 방법은 \x
16진수 문자열을 나타내지 않을 수 있는 뒤에 있는 가짜 값을 계산할 가능성이 높습니다.
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
이는 스크립트를 작성하고 싶지 않은 경우(예: 실행할 명령이 포함된 지침 시트) 빠르고 쉬운 한 줄을 제공합니다.