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

  • отменить по умолчанию ключ от inputrc
  • Можно ли назначить несколько команд одной горячей клавише? (bash, xterm)
  • Как убить вперед до конца большого слова или следующего символа пробела
  • Есть ли клиенты IRC с командной строкой, использующие readline?
  • Как включить все ключи привязки по умолчанию vi-edit-mode в bash?
  • rlwrap: многоязычное автозаполнение tclsh
  • Как преобразовать параметры inputrc в bashrc?
  • Перемещение по пробельному разделительному слову в bash / readline
  • 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
    Linux и Unix - лучшая ОС в мире.