Hexdump строки, запускающейся в новых строках?

Некоторый классический ASCII невидимые пробельные символы:

  • Вкладка: \t
  • Новая строка: \n
  • Возврат каретки: \r
  • Перевод формата: \f
  • Вертикальная вкладка: \v

Все их рассматривает как символы компьютер и отображают как пробел человеку.

Другие невидимые символы включают

  • Слышимый звонок: \a
  • Клавиша Backspace: \b

А также длинный список в статье Википедии, данной frostschutz.

7
14.03.2015, 19:22
2 ответа

Ну, есть 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
0
27.01.2020, 20:19

Вот одна возможность, компактное решение, которое использует , прочитал возможность ограничить количество чтения символов:

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
2
27.01.2020, 20:19

Теги

Похожие вопросы