Некоторый классический ASCII невидимые пробельные символы:
\t
\n
\r
\f
\v
Все их рассматривает как символы компьютер и отображают как пробел человеку.
Другие невидимые символы включают
\a
\b
А также длинный список в статье Википедии, данной frostschutz.
Ну, есть 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
)
Вы можете передать его stdin или аргументы или оба. Итак ...
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.|
Измените разъем по умолчанию, как ...
split=${somechar} hex_split
Вот одна возможность, компактное решение, которое использует , прочитал
возможность ограничить количество чтения символов:
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