ある場合は、次のように教えてください。
blah;PC=1234abcd
PC=4444bbcd;blah
PC=0000abcd;;foo
PC=1234abff
PC値が指定された範囲内にgrep
ある行をどのように処理できますか?1234ab00
1234b0ff
範囲-
オプションは通常の順序でのみ機能するように見え、0-9a-A
16進範囲では機能しません。
答え1
grep -f <(printf "%x\n" $(seq -f "%.f" $(printf "%d %d" 0x1234ab00 0x1234b0ff))) file
printf
2つの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のいずれかに一致します。