从新行开始的字符串的十六进制转储?

sda*_*aau 7 hexdump hex text-formatting

假设我有一个多行字符串,但上面的条目很短;如果我尝试 hexdump,那么我会得到这样的信息:

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
Run Code Online (Sandbox Code Playgroud)

大多数十六进制转储程序,包括hexdump简单地用作 2D 矩阵(您可以定义每行将有多少字节/列);所以在这种情况下,整个输出被压缩在两行转储上。

有没有我可以使用的程序,它会像往常一样继续运行 - 除非遇到新行(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
Run Code Online (Sandbox Code Playgroud)

mik*_*erv 0

嗯,有printf...

hex_split()(    unset c dump slice rad pend
        _get(){ dd bs=1024 count=1; echo .; } 2>/dev/null
        _buf()  case $((${#dump}>0)):$((${#slice}>0)) in
                (0:*)   dump=$(_get); dump=${dump%.}
                        [ -n "$dump" ] || [ -n "$slice" ];;
                (*:0)   [ "${#dump}" -lt 16 ]       &&
                        slice=${dump:-$slice} dump= && return
                        slice=${dump%"${dump#$q}"} dump=${dump#$q};;esac
        _out(){ printf "%08x%02.0s" "$rad" "$((rad+=$#/2))"
                printf "%02x %.0s" "$@"
                printf "%-$(((16-($#/2))*3))s"
                printf "%.0s%.1s" '' ' ' '' \| "$@" '' \| '' "$nl"
};      q=$(printf %016s|tr \  \?) ; IFS=\  nl='
'       rad=0 c=0 split=${split:-$nl} slice="$*"; set --
        while   [ -n "$slice" ] || _buf || ! ${1:+"_out"} "$@" &&
                c=${slice%"${slice#?}"} slice=${slice#?}                
        do      set "$@" "'$c" "${c#[![:print:]]}."
                case $#$c in    (32*|*$split)   _out "$@"; set --;;esac
        done
)
Run Code Online (Sandbox Code Playgroud)

您可以将标准输入或参数或两者都交给它。所以...

echo "something
is
being
written
here" | hex_split something else besides
Run Code Online (Sandbox Code Playgroud)

...上面的打印...

00000000  73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 20 62  |something else b|
00000010  65 73 69 64 65 73 00 73 6f 6d 65 74 68 69 6e 67  |esides.something|
00000020  0a                                               |.|
00000021  69 73 0a                                         |is.|
00000024  62 65 69 6e 67 0a                                |being.|
0000002a  77 72 69 74 74 65 6e 0a                          |written.|
00000032  68 65 72 65 0a                                   |here.|
Run Code Online (Sandbox Code Playgroud)

更改默认的分割字符,例如...

split=${somechar} hex_split
Run Code Online (Sandbox Code Playgroud)