编辑1

编辑1

我有包含十六进制和随机字符串的文件~/dummy_hex.txt

\x12\xA1\xF1\xE3somegibberigh

我想计算上面的字符串有多少个十六进制值(\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 }'

但由于正则表达式错误类型,不知何故似乎返回错误结果。您能告诉我如何将完整的 PCRE 兼容正则表达式与 sed 一起使用来做到这一点吗?

或者,我想计算我的字符串包含多少个十六进制值。

编辑1

另一种方法是对\x字符串出现次数进行计数,但这可能会计算后面\x可能没有指示十六进制字符串的值的任何杂散。

 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

如果计算不带十六进制的字符:

$ 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

您可以获得十六进制字符的计数(乘以 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

如果您不想编写脚本(例如,在包含要执行的命令的说明表上),这提供了快速简便的单行代码。

相关内容