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

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

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

  • Как исправить bash или auto run / bin / bash в SSH login
  • Как передать вывод скрипта команде ls без разделения данных?
  • Перенаправление стандартного вывода ошибки в переменную bash
  • Даемонзировать процесс в оболочке?
  • расширение скобки и * расширение
  • как загрузить файл, используя только bash и ничего больше (никаких завитушек, wget, perl и т. д.)
  • 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 с помощью чтения Баха)?

  • Считать дубликаты строк с ограничением
  • Есть ли команда, показывающая время, прошедшее при длительном процессе?
  • Можно ли повторно использовать первый аргумент линии BASH в одной строке?
  • Отображать файл с цветами ANSI
  • Как SSH в определенный каталог?
  • Как улучшить функцию упрощения команды history
  • 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 не так ли?

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