Skip to main content
deleted 31 characters in body
Source Link
mikeserv
  • 59.4k
  • 10
  • 122
  • 242
nl=hex_split()( split="${nl:= }" rad=0 c=0unset c dump slice rad pend dump=something${nl}is${nl}being$ _get(){nl dd bs=1024 count=1; echo .; }written$ 2>/dev/null _buf() case $((${nl#dump}here$>0)):$((${nl#slice}>0)) in until [ -z "$dump" ] do break= (0:;*) set -- dump=$(_get); dump=${dump%.} while [ -n "$dump" ]  do c=${dump%"${dump#?}"}  [ -n "$dump" ] || [ -n "$slice" dump=${dump#?}];; case $#$c in  (30*|*$split*:0) ! : ;; [ "${#dump}" -lt 16 ] &&  esac || break=break  set "$@" "'$c" "$ slice=${c#[![:printdump:]]-$slice}." dump= && return "$break"  done 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 ) 

You can hand it stdin or arguments or both. So...

echo "something is being written here" | hex_split something else besides 
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 |something |.| 0000000a00000021 69 73 0a |is.| 0000000d00000024 62 65 69 6e 67 0a |being.| 000000130000002a 77 72 69 74 74 65 6e 0a |written.| 0000001b00000032 68 65 72 65 0a |here.| 

Change the default split char like...

split=${somechar} hex_split 
nl= split="${nl:= }" rad=0 c=0 dump=something${nl}is${nl}being${nl}written${nl}here${nl} until [ -z "$dump" ] do break=:; set -- while [ -n "$dump" ]  do c=${dump%"${dump#?}"}  dump=${dump#?} case $#$c in (30*|*$split) ! : ;;  esac || break=break  set "$@" "'$c" "${c#[![:print:]]}." "$break"  done printf "%08x%02.0s" "$rad" "$((rad+=$#/2))" printf "%02x %.0s" "$@" printf "%-$(((16-($#/2))*3))s"    printf "%.0s%.1s" '' ' ' '' \| "$@" '' \| '' "$nl" done 
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.| 
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 ) 

You can hand it stdin or arguments or both. So...

echo "something is being written here" | hex_split something else besides 
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.| 

Change the default split char like...

split=${somechar} hex_split 
deleted 31 characters in body
Source Link
mikeserv
  • 59.4k
  • 10
  • 122
  • 242

Well, there is printf...

nl= split="${nl:= }" rad=0 c=0 dump=something${nl}is${nl}being${nl}written${nl}here${nl} until [ -z "$dump" ] do break=:; set -- while [ -n "$dump" ] do c=${dump%"${dump#?}"} dump=${dump#?} case $#$c in (30*|*$split) ! : ;;  ;;  esac || break=break  (*)  set "$@" "'$c" "${c#[![:print:]]}.";;" esac || break"$break" done set "$@" "'$c" "${c#[![:print:]]}." printf "%08x%02.0s" "$rad" "$((rad+=$#/2))" whileprintf ["%02x "$#"%.0s" -lt"$@"  32 ]  printf "%-$(((16-($#/2))*3))s" do set "$@" '' ''; done  printf "%02.0x%01.0s" "$@"  printf "%.0s%.1s" '' ' ' '' \| "$@" '' \| '' "$nl" done 

...the above prints...

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

Well, there is printf...

nl= split="${nl:= }" rad=0 c=0 dump=something${nl}is${nl}being${nl}written${nl}here${nl} until [ -z "$dump" ] do set -- while [ -n "$dump" ] do c=${dump%"${dump#?}"} dump=${dump#?} case $#$c in (30*|*$split) ! : ;;  (*) set "$@" "'$c" "${c#[![:print:]]}.";; esac || break done set "$@" "'$c" "${c#[![:print:]]}." printf "%08x%02.0s" "$rad" "$((rad+=$#/2))" while [ "$#" -lt 32 ]  do set "$@" '' ''; done  printf "%02.0x%01.0s" "$@" printf "%.0s%.1s" '' ' ' '' \| "$@" '' \| '' "$nl" done 

...the above prints...

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

Well, there is printf...

nl= split="${nl:= }" rad=0 c=0 dump=something${nl}is${nl}being${nl}written${nl}here${nl} until [ -z "$dump" ] do break=:; set -- while [ -n "$dump" ] do c=${dump%"${dump#?}"} dump=${dump#?} case $#$c in (30*|*$split) ! : ;;  esac || break=break    set "$@" "'$c" "${c#[![:print:]]}." "$break" done printf "%08x%02.0s" "$rad" "$((rad+=$#/2))" printf "%02x %.0s" "$@"  printf "%-$(((16-($#/2))*3))s"   printf "%.0s%.1s" '' ' ' '' \| "$@" '' \| '' "$nl" done 

...the above prints...

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.| 
Source Link
mikeserv
  • 59.4k
  • 10
  • 122
  • 242

Well, there is printf...

nl= split="${nl:= }" rad=0 c=0 dump=something${nl}is${nl}being${nl}written${nl}here${nl} until [ -z "$dump" ] do set -- while [ -n "$dump" ] do c=${dump%"${dump#?}"} dump=${dump#?} case $#$c in (30*|*$split) ! : ;; (*) set "$@" "'$c" "${c#[![:print:]]}.";; esac || break done set "$@" "'$c" "${c#[![:print:]]}." printf "%08x%02.0s" "$rad" "$((rad+=$#/2))" while [ "$#" -lt 32 ] do set "$@" '' ''; done printf "%02.0x%01.0s" "$@" printf "%.0s%.1s" '' ' ' '' \| "$@" '' \| '' "$nl" done 

...the above prints...

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