Чтение символа с помощью символа 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 с помощью чтения Баха)?

  • Возможно ли (re) определить, какая readline (встроенная в bash) определяет как слово?
  • Как искать историю bash в режиме vi для «foo. * Bar»
  • Выделение текста в bash при использовании обратного поиска истории с помощью Ctrl-R
  • readline: неинкрементный поиск предлагает что-либо, чего нет в инкрементальном поиске?
  • тайм-аут вызывает, когда цикл чтения заканчивается, когда `cat` отключен
  • Перемещение курсора в конец строки при использовании истории-поиска-назад
  • Как преобразовать параметры inputrc в bashrc?
  • Alt-Left для пропуска слов не работает в эмуляторах терминалов
  • 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 не так ли?

    Interesting Posts

    Сдвиг-пространство меньше

    Получение двух полей из одной строки вместе

    Не может ssh использовать PuTTy с действительным именем пользователя и паролем. Как убедиться, что сервер и клавиатура / терминалы PuTTy одинаковы? Другие вопросы?

    Как установить Ubuntu в нетбук, но сохраняя первоначальную установку win7 в хранилище

    Как Wireshark видит пакеты, упавшие с помощью iptables?

    dovecot mysql-connection ошибка из-за специального charater в config

    Пейджер Center Mutt горизонтально

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

    Любой случайный пароль приводит к успешному входу в систему tty

    Проверка резервной копии .tar.gz

    Ввод текста с помощью Awesome WM

    Git отслеживания dotfiles, которые символически связаны

    Скопируйте stdout и stderr в файл журнала и оставьте их на консоли в самом скрипте

    Строки Grep, где изменения происходят в столбцах

    Используя ffmpeg для записи подкаста, каждый источник звука в канале

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