Чтение символа с помощью символа bash

Я пытаюсь использовать bash для чтения символа файла по символу.

После долгих проб и ошибок я обнаружил, что это работает:

exec 4<file.txt declare -in while read -r ch <&4; n=0 while [ ! $n -eq ${#ch} ] do echo -n "${ch:$n:1}" (( n++ )) done echo "" done 

Т.е., я могу читать это по строкам, а затем прокручивать каждый символ строки char.

Прежде чем это сделать, я попытался: exec 4<file.txt && while read -r -n1 ch <&4; do; echo -n "$ch"; done exec 4<file.txt && while read -r -n1 ch <&4; do; echo -n "$ch"; done но он пропустит все пробелы в файле .

Не могли бы вы объяснить, почему? Есть ли способ сделать вторую стратегию (т. Е. Считывать символ char с помощью чтения Баха)?

2 Solutions collect form web for “Чтение символа с помощью символа bash”

Вам нужно удалить пробельные символы из параметра $IFS для read чтобы остановить пропуски ведущих и конечных (с -n1 , -n1 пробела, если любой из них будет как ведущим, так и конечным, поэтому пропущен):

 while IFS= read -rn1 a; do printf %s "$a"; done 

Но даже тогда read bash пропустит символы новой строки, с которыми вы можете работать:

 while IFS= read -rn1 a; do printf %s "${a:-$'\n'}"; done 

Хотя вы могли бы использовать IFS= read -d '' -rn1 вместо или даже лучше IFS= read -N1 (добавлено в 4.1, скопировано из ksh93 (добавлено в o )), которое является командой для чтения одного символа.

Обратите внимание, что read bash не может справиться с символами NUL. И ksh93 имеет те же проблемы, что и bash.

С zsh:

 while read -ku0 a; do print -rn -- "$a"; done 

(zsh может справиться с символами NUL).

Обратите внимание, что те, кто read -k/n/N считывают несколько символов , а не байты . Поэтому для многобайтовых символов им может потребоваться прочитать несколько байтов, пока не будет прочитан полный символ. Если вход содержит недопустимые символы, вы можете получить переменную, содержащую последовательность байтов, которая не образует действительных символов, а оболочка может рассчитывать как несколько символов . Например, в локали UTF-8:

 $ printf '\375\200\200\200\200ABC' | bash -c ' IFS= read -rN1 a; echo "${#a}"' 6 

Это \375 представит 6-байтовый символ UTF-8. Тем не менее, 6-й ( A ) выше недействителен для символа UTF-8. Вы по-прежнему в конечном итоге с \375\200\200\200\200A в $a , который bash насчитывает 6 символов, хотя первые 5 не являются действительно символами, всего 5 байтов, которые не являются частью какого-либо символа.

Это простой пример использования cut , a for loop & wc :

 bytes=$(wc -c < /etc/passwd) file=$(</etc/passwd) for ((i=0; i<bytes; i++)); do echo $file | cut -c $i done и bytes=$(wc -c < /etc/passwd) file=$(</etc/passwd) for ((i=0; i<bytes; i++)); do echo $file | cut -c $i done 

KISS не так ли?

  • Как я могу использовать vi для редактирования строки подсказки утилиты?
  • Readline .inputrc сбрасывает значения по умолчанию с каждой строкой
  • Связывание строк, не работающих с модификаторами Control и Shift
  • Как отобразить управляющие символы (^ C, ^ D, ^ [, ...) по-разному в оболочке
  • Как удалить последнюю часть пути в bash?
  • Как изменить настройки чтения на клавиатуре?
  • Установка переменных readline в оболочке
  • Как вы настраиваете .inputrc, поэтому ALT + UP имеет эффект cd
  • Как печатать быстрые клавиши в форме для человека?
  • Поместить текст в буфер командной строки bash
  • Просмотр параметров пути при использовании readline?
  • Shell: Как получить последний аргумент предыдущей команды, когда она была отсоединена?
  • Interesting Posts

    Насколько разумны утилиты unix?

    Лучший способ запустить команду для каждого файла в дереве каталогов

    Можно ли конвертировать аудио в midi с оболочкой?

    Как повернуть все изображения в каталоге с помощью imagemagick?

    CUPS печать PDF-файлов

    Unix / Linux восстанавливает и восстанавливает удаленные файлы

    Как удалить границу под заголовком в Gnome 3.20?

    Использование даты -1day с помощью wget

    libandroid-shmem показывает недопустимый заголовок ELF в chrooted linux

    Может использовать аутентификацию паролей с помощью SFTP, хотя «PasswordAuthentication no» в / etc / ssh / sshd_config

    Как установить раскладку клавиатуры, используемую для ввода пароля в зашифрованную файловую систему?

    Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?

    Как изменить основную группу?

    конвертировать команду update-rc.d в chkconfig

    MariaDB – проблемы с зависимостями – оставляя неконфигурированные

    Linux и Unix - лучшая ОС в мире.