例:
入力する:
0x12345678 0aef1234 0098adefa 123456789
予想出力:
0x00000000 00000000 0098adefa 123456789
これを試しました:
sed -E "s/[0-9a-fA-F]{8}/00000000/g"
ただし、16進数が8個以上連続しても置換されます。
答え1
単語の境界を使用して単語の始まりまたは終わりを表示することができ、数字の前に来ることもできることを検討し\b
てください。0x
sed -E 's/\b(0x|)[0-9a-fA-F]{8}\b/\100000000/g'
それでもいくつかの特別なケースがあるので、これを処理する方法を検討する必要があります。たとえば、00x12345678
上記のパターンでは置き換えられません。
答え2
Perl では、「lookaround アサーション」を使用できます。つまり、「前に16進数なし」と「後に16進数がない」と言えます。
perl -pe 's/(?<![0-9a-fA-F])[0-9a-fA-F]{8}(?![0-9a-fA-F])/00000000/g'
Lookaroundは一致する文字列を計算しません。つまり、置き換えられず、複数回一致することができます(LookBehindでは1回、Lookaheadでは1回)。
[:xdigit:]
代わりにPOSIXクラスを使用することもできます0-9a-fA-F
。
答え3
$ echo '0x12345678 0aef1234 0098adefa 123456789' | sed -E 's/(\<|x)[[:xdigit:]]{8}\>/\100000000/g'
0x00000000 00000000 0098adefa 123456789
$ echo '12345678 0aef1234 0098adefa 123456789' | sed -E 's/(\<|x)[[:xdigit:]]{8}\>/\100000000/g'
00000000 00000000 0098adefa 123456789
正規表現
(\<|x)[[:xdigit:]]{8}\>
8桁の16進数と一致します。完全な言葉であるか、前に行く必要がありますx
。前の文字(x
存在する場合)が保存され、交換時にゼロの前に挿入されます。