如何使用 grep 返回给定范围内的十六进制数的行?

如何使用 grep 返回给定范围内的十六进制数的行?

如果我有,请说:

blah;PC=1234abcd
PC=4444bbcd;blah
PC=0000abcd;;foo
PC=1234abff

我如何grep处理 PC 值在给定范围内的行,1234ab00例如1234b0ff.

range-选项似乎只适用于常规0-9a-A顺序,这显然不适用于十六进制范围。

答案1

grep -f <(printf "%x\n" $(seq -f "%.f" $(printf "%d %d" 0x1234ab00 0x1234b0ff))) file
  • 内部printf打印两个十六进制值的十进制值。
  • 然后seq以十进制打印它们之间的所有内容。
  • 外部printf打印所有这些十进制值的十六进制值。
  • 最后grep -f搜索 中的所有这些模式file

输出:

blah;PC=1234abcd
PC=1234abff

答案2

我会用perl

perl -ne 'print if /PC=([\da-fA-F]+)/ &&
                   ($n=hex $1) >= 0x1234ab00 &&
                    $n <= 0x1234b0ff'

使用grep,这将非常麻烦,您必须针对每个范围调整正则表达式,例如:

LC_ALL=C grep -E 'PC=0*1234([aA][b-fB-F]|[bB]0)[0-9a-fA-F]{2}([^0-9a-fA-F]|$)'

括号表达式内的范围仅适用于字符。括号表达式只匹配一个特点(好吧,整理元素)。在 C 语言环境中[0-9]是 的缩写[0123456789],因此它匹配这 10 个阿拉伯数字字符中的任何一个。[0-25]如此[0125]匹配 0、1、2、5 中的任何一个。

相关内容