shスクリプトからバイナリファイルを作るにはどうすればよいか


ちょっとしたバイナリファイルが必要なときは`echo -n -e`で作っていますが、もっと楽にできる方法をご存じないでしょうか。

既に存在するバイナリファイルの変更は、odの結果をgawkで`echo`形式に加工してbashに渡していますが、新規に作るときが悩ましいです。余裕があればプログラムを書いて作っていますが、もっと手軽にできる方法を探しています。

**バイナリファイルを作る元の表現形式**

  * 内容はランダムでよい
  * 値は指定したい(16進数だけでも可、できれば文字列、10進数、16進数の混在が指定できるとなお良い)

**実行環境**

WSLを含むUnix系の環境




シェルスクリプト内でperlを使うことに抵抗がないなら、packを使うと第1引数のテンプレート文字列で変換方法を指定しつつ柔軟にバイナリ化させることが出来ます。

[code]

    $ perl -e 'print pack( "NVnvCa15", 0x12345678, 0x12345678, 0xabcd, 0xabcd, 9, "test string" )' | hexdump -C
    00000000  12 34 56 78 78 56 34 12  ab cd cd ab 09 74 65 73  |.4VxxV4......tes|
    00000010  74 20 73 74 72 69 6e 67  00 00 00 00              |t string....|
    0000001c
    
[/code]




コメント欄で解決しているようですので、回答として転載しておきますね。

> 2桁の16進数の並びであれば `echo 011affb0ab | grep -Eo '..' | xargs -n1 -I@ printf
> '\x@'` でしょうか。 –
> [metropolis](https://ja.stackoverflow.com/users/16894/metropolis)

**追加: sed 版**

[code]

    $ printf $(echo 011affb0ab | sed -E 's/(..)/\\x\1/g') | od -tx1a
    0000000  01  1a  ff  b0  ab
            soh sub del   0   +
    
[/code]

