テキストファイルの16進値を(変更された)10進値に置き換えます。

テキストファイルの16進値を(変更された)10進値に置き換えます。

ファイル内にはtest.txt16進値があります。

0x0000000000000000000000000000000000000000047546124890225541102135415377465907

1行。他の行や文字はありません。また、0x でのみ識別されます。

388355321549592156970965297418600041568519この16進値を10進数()に変換して1を引いて、この操作の結果として元の値を上書きしたいと思います。test.txt

最終的には、ファイルのデータはtest.txt次から始める必要があります。

0x0000000000000000000000000000000000000000047546124890225541102135415377465907

到着

388355321549592156970965297418600041568518

Bash(Linuxシェル)を使ってこれを行う方法を教えてくれてありがとう。

答え1

、を使用してperlファイルを所定の位置に編集します。

perl -Mbigint -lpi -e '$_ = hex($_) - 1' your-file

行全体が16進数であるとします。場所に関係なくすべての16進数を変換するには:

perl -Mbigint -lpi -e 's{\b0x[\da-f]+\b}{hex($&) - 1}gie' your-file

答え2

牛に似た一種の栄養awk

gawk -M '{print strtonum($0)-1}' file

-M(または--bignum) 任意の精度算術のためのものです。strtonum($0)で始まる文字列を16進数として処理して、レコードの数値を取得します0x-i inplace入力ファイルを内部編集するためのものです。

答え3

Bashのコマンドでは、この文字列と電卓(サフィックス表記を含む)を使用してください。

dc -e '16iAo?1-p' <<<$(<file) >file

16i-ベース入力
Ao-出力ベース
?-一行を読む
1--マイナス1
p-印刷

注:これはあなたの例では指定されていません。dc電卓は大文字の16進数[ABCDEF]を受け入れます。

答え4

この答えは、ファイルのどこかにある16進数に関する質問に提供されています。後で、ファイル全体がその番号でのみ構成されたという質問が更新されました。この答えはまだ有効ですが、もちろんsedこの特別な場合には使用しません。元の質問に対する答えを探している人のための参考資料としてここに残してください。コメントにも注意してください。

もしあれば、bashおそらくGNUもありますsed(コマンドeフラグを含むs)。その場合、bc数値が大きすぎるため、電卓も必要ですbash

sed 's/^0x0*\(.*\)/echo "ibase=16; \1-1"|bc/e' yourfile
  • 私の考えでは、で始まるすべての行を0x変換する必要がありますが、簡単に調整できます。
  • 0x0*\(.*\)置き換えるパターンです。先行および追加先行ゼロを削除し、交換時に参照できるように、他の0xすべての項目はそのまま残しました。\(…\)\1
  • echo "ibase=16; \1-1"|bce交換後にシェルによって実行されるシェルコマンド。
  • 実際の計算では、\1-1整理された16進数はマイナス1になります。 16進数であるibase=16ことを伝えます。bc

関連情報