Diary

Diary

日々学んだことをアウトプットする場として初めてみました

ターミナル上で数値の16進数の変換を行う

ターミナル上で数値の16進数の変換を行う

  • bc コマンド, obase
  • カラーコードを、(255,255,255) -> #FFFFFF への変換を行う

bc コマンド

  • 基本的な計算をしてくれるコマンド
$ echo '4*5' | bc
> 20
  • 桁数指定
    • デフォルトでは小数点以下切り捨てになるので、scaleを指定してあげる
    • scaleをつける場所に注意
$ echo '1/3' | bc
> 0
$ echo 'scale=4; 1/3' | bc
> .3333
  • 数学ライブラリを用いるとlogの計算などができる
    • 詳しくはman bc | grep '\-l' -A20などで確認すると良い
    • -lオプションで指定できる
## l(x) = log(x)
$ echo 'l(3)' | bc -l
> 1.09861228866810969139

bcコマンドを用いた16進数への変換

  • obaseを用いる
  • output base(出力の基底)を指定できるオプション(?)
    • ibase: inputバージョンもある
  • 使い方
$ echo 'obase=16; 255' | bc
> FF

カラーコードの変換

目標は

(255, 255, 255) -> #FFFFFF への変換を行う

こと

実際の手順

1 ()や,の前後のスペースを取り除く

$ echo "(255, 255, 255)" | tr -d "() "
> 255,255,255

2 各々の数字に対して上の"bcを用いた基底変換"を使いたかったので、','で区切って行に変換

$ echo "(255, 255, 255)" | tr -d "() " | tr "," "\n"
> 255
> 255
> 255

3 各行に対してbcコマンドを用いて16進数へ変換

$ echo "(255, 255, 255)" | tr -d "() " | tr "," "\n" | xargs -I@ echo "obase=16; @" | bc
> FF
> FF
> FF

4 最後に3行をまとめてあげて、先頭に#をつけたら完成

$ echo "(255, 255, 255)" | tr -d "() " | tr "," "\n" | xargs -I@ echo "obase=16; @" | bc | tr -d "\n" | sed "s@^@#@"
> #FFFFFF
$ echo "(128, 32, 32)" | tr -d "() " | tr "," "\n" | xargs -I@ echo "obase=16; @" | bc | tr -d "\n" | sed "s@^@#@"
> #802020

(おまけ)ファイルから (255,255,255) のようなカラーコードを見つける

  • grep拡張正規表現のオプションを利用する(登場回数を{}で指定できるようになる)
  • (a, b, c)を抜き出すコマンド
    • a,b,cは1-3桁の数字
    • b,c の前には空白があってもなくても良い
$ cat color 
> (255, 255, 255) is one of the ideal color code.
> (2555, 123, 1) is a bad request.
> (12,3,6) is also detected.

$ cat color | grep -Eo '\([0-9]{1,3},\s?[0-9]{1,3},\s?[0-9]{1,3}\)'
> (255, 255, 255)
> (12,3,6)

tag

linux, ワンライナー