ファイル内にはtest.txt
16進値があります。
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"|bc
e
交換後にシェルによって実行されるシェルコマンド。- 実際の計算では、
\1-1
整理された16進数はマイナス1になります。 16進数であるibase=16
ことを伝えます。bc