Text-Processing

如何使用 grep 返回給定範圍內具有十六進制數字的行?

  • December 16, 2015

如果我有,請說:

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

我如何獲取給grep定範圍內 PC 值的行,例如.1234ab00``1234b0ff

-range 選項似乎只適用於顯然不適用於十六進制範圍的正常順序0-9a-A

grep -f <(printf "%x\n" $(seq -f "%.f" $(printf "%d %d" 0x1234ab00 0x1234b0ff))) file
  • 內部printf列印兩個十六進制值的十進制值。
  • 然後seq以十進制列印它們之間的所有內容。
  • 外部printf列印所有這些十進制值的十六進制值。
  • 最後grep -ffile.

輸出:

blah;PC=1234abcd
PC=1234abff

我會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]is [0125]so 匹配 0、1、2、5 中的任何一個。

引用自:https://unix.stackexchange.com/questions/248796