grepを使用して与えられた範囲の16進行を返す方法は?

grepを使用して与えられた範囲の16進行を返す方法は?

ある場合は、次のように教えてください。

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

PC値が指定された範囲内にgrepある行をどのように処理できますか?1234ab001234b0ff

範囲-オプションは通常の順序でのみ機能するように見え、0-9a-A16進範囲では機能しません。

答え1

grep -f <(printf "%x\n" $(seq -f "%.f" $(printf "%d %d" 0x1234ab00 0x1234b0ff))) file
  • printf2つの16進値のうち10進値を内部的に印刷します。
  • 次に、seqそれらの間のすべてを10進数で印刷します。
  • printfこれらすべての10進値の16進値を外部で印刷します。
  • 最後の検索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]|$)'

角かっこ式内の範囲は文字にのみ適用されます。角かっこ式は1つだけ一致します。特徴(良い、要素を整理してください)。 Cロケールで[0-9]はの略語[0123456789]なので、10個のアラビア数字と一致します。[0-25]これは[0125]0、1、2、5のいずれかに一致します。

関連情報