新しい行から始まる文字列の16進ダンプ?

新しい行から始まる文字列の16進ダンプ?

複数行の文字列があり、その中の項目が短いとしましょう。 16進ダンプを試みると、次の結果が表示されます。

echo "something
is
being
written
here" | hexdump -C

#00000000  73 6f 6d 65 74 68 69 6e  67 0a 69 73 0a 62 65 69  |something.is.bei|
#00000010  6e 67 0a 77 72 69 74 74  65 6e 0a 68 65 72 65 0a  |ng.written.here.|
#00000020

ほとんどの16進ダンププログラムはhexdump単に2Dマトリックスとして機能するため(各行のバイト/列数を定義できます)、この場合、出力全体は2行ダンプに圧縮されます。

いつものように実行し続けるプログラムはありますか?新しい行(0x0a- しかし、他の文字やそのシーケンスも可能)に遭遇しない限り、新しい行も始まりますか?この場合、次のような出力が必要です。

00000000  73 6f 6d 65 74 68 69 6e  67 0a                    |something.|
0000000a  69 73 0a                                          |is.|
0000000d  62 65 69 6e 67 0a                                 |being.|
00000013  77 72 69 74 74 65 6e 0a                           |written.|
0000001b  68 65 72 65 0a                                    |here.|
00000020

ベストアンサー1

read以下は、読み取る文字数を制限する機能を利用するコンパクトソリューションの1つです。

c=0
while IFS= read -n16 -r line
do
  len=${#line}
  ((len<16)) && { ((len++)) ; line+=$'\n' ;}
  printf "%08x  " $c
  for ((i=0; i<len; i++))
  do  printf " %02x" "'${line:i:1}"
  done
  printf " %*s %s\n" $((50-3*len)) "" "'${line//[^[:print:]]/.}'"
  ((c+=len))
done

おすすめ記事