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

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

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

  • «Нет такого файла или каталога», когда я отчетливо вижу файл с правильными разрешениями
  • изменить язык в скрипте
  • Как управлять всеми параметрами сценария оболочки сразу?
  • [[и эквивалентность случая в bash
  • функция forward и переменные в sudo su - <user> << EOF
  • Как создать локальную функцию в моем bashrc?
  • 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 с помощью чтения Баха)?

  • Почему grep -o -w не дает мне ожидаемого результата в Mac OS X?
  • Подводя массив внутри awk?
  • Как я могу обнаружить, что никакие опции не были переданы с помощью getopts?
  • Почему время bash точнее, чем время GNU?
  • Как я могу полностью удалить элемент из массива?
  • Функция Bash, которая принимает входные данные от параметра или трубы
  • 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 - лучшая ОС в мире.