16進数8桁だけを変更してください。 8桁未満または多い場合は無視してください。 sed コマンドの使用

16進数8桁だけを変更してください。 8桁未満または多い場合は無視してください。 sed コマンドの使用

例:


入力する:

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存在する場合)が保存され、交換時にゼロの前に挿入されます。

関連情報