編集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

これは、スクリプトを作成したくない場合(たとえば、実行するコマンドを含むガイドシート)など、すばやく簡単な行を提供します。

関連情報