我有包含十六进制和随机字符串的文件~/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
如果您不想编写脚本(例如,在包含要执行的命令的说明表上),这提供了快速简便的单行代码。