

Linuxでバイナリ編集を行うコマンドはあるでしょうか。`sed`、`awk`のバイナリ版みたいなものを想定しています。このコマンドを使って、例えば複数のファイルの何バイト目を何々の値に一括して書き換える、ということを行いたいと思っています。

検索して`echo`と`dd`を使う方法を見つけました。（`echo`はGNU版）

[code]

    $ echo -ne '\x<1バイト目>\x<2バイト目>...' | dd of=<ファイル> bs=1 seek=<始バイト> conv=notrunc
    
[/code]

ただこの方法だと  
1.元ファイルを変更する書き方である  
2.書き込み内容が適当かどうかのチェックがない（値、範囲など）  
3.できることが単純すぎる（分岐処理がない等）  
といった点が不便だと感じました。


CC BY-SA 3.0
2016-06-24T14:09:43.920
27037
2016-06-25T02:58:15.397
2016-06-25T02:58:15.397
13199
13199
question
linux shellscript
バイナリを一括して編集するためのコマンドはありますか？


`vim -b file` でファイルを開いて `:%!xxd` とすれば バイナリエディタになります。  
保存するときは `:%!xxd -r` をやってから `:w` で保存します。


CC BY-SA 3.0
2016-06-24T14:40:33.743
27038
2016-06-24T14:40:33.743
5008
27037
answer


beav などのバイナリエディタを使う方が望ましいかと思いますが、ここでは GNU awk を使ってみます。

GNU awk には拡張機能として、ファイル全体を読み込む `readfile` 関数が用意されています。以下ではファイル全体を読み込んだ後、1 byte
単位で分割して配列変数(`data`)にセットしています。その後、一部を変更して出力しています。

[code]

    $ printf '\0漢字\nHello World\nGood night\n' > input_file
    $ od -tx1c input_file
    0000000  00  e6  bc  a2  e5  ad  97  0a  48  65  6c  6c  6f  20  57  6f
             \0 346 274 242 345 255 227  \n   H   e   l   l   o       W   o
    0000020  72  6c  64  0a  47  6f  6f  64  20  6e  69  67  68  74  0a
              r   l   d  \n   G   o   o   d       n   i   g   h   t  \n
    
    $ gawk --characters-as-bytes -v f=input_file -l readfile -i join '
          BEGIN{
            len = split(readfile(f), data, "")
            data[1] = "\x0c"; data[15] = "w"; data[26] = "N"
            printf("%s", join(data, 1, len, SUBSEP))
            exit
          }
        ' | od -tx1c
    0000000  0c  e6  bc  a2  e5  ad  97  0a  48  65  6c  6c  6f  20  77  6f
             \f 346 274 242 345 255 227  \n   H   e   l   l   o       w   o
    0000020  72  6c  64  0a  47  6f  6f  64  20  4e  69  67  68  74  0a
              r   l   d  \n   G   o   o   d       N   i   g   h   t  \n
    
[/code]


CC BY-SA 3.0
2016-06-24T15:22:06.970
27043
2016-06-24T17:54:48.393
2016-06-24T17:54:48.393
27037
answer


[xxd](http://linuxcommand.org/man_pages/xxd1.html) を使うのはどうでしょうか。 hexdump
したり、それを binary に戻したりできる様子です。いったん text になってしまえば、どうとでも編集できると思うので。。

[code]

    $ xxd nulls.txt
    0000000: 0000 0000                                ....
    
    $ xxd -p nulls.txt
    00000000
    
    $ xxd -p nulls.txt | sed s/^0/1/ | xxd -r -p - - > nulls-changed.txt
    
    $ xxd nulls-changed.txt
    0000000: 1000 0000                                ....
    
[/code]


CC BY-SA 3.0
2016-06-24T15:43:32.677
27045
2016-06-24T15:43:32.677
754
27037
answer