如果我有,请说:
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 中的任何一个。