Чтение из текстового файла и печати символов слова по символу за раз

Конечно, вы можете использовать cat или cp. Но у dd есть больше возможностей, таких как резервное копирование / восстановление загрузочного сектора или копирование ограниченного количества случайных данных из / dev / random.

В Википедии есть более подробное описание различных вариантов использования.

2
09.09.2018, 00:15
5 ответов

Вы можете сделать это с помощью Perl, как показано:

perl -pe 'BEGIN{$/=\1;$|=1;} sleep 1' log.txt
  • -pавтоматически напечатает текущую запись перед получением следующей.
  • $/=\1заставит perlчитать входной поток по байтам за раз, при условии, что символы имеют размер байта.
  • $|=1будет буферизовать вывод.
0
27.01.2020, 21:49

Вы можете сделать это

var=$(cat log.txt)
for (( i=0; i<${#var}; i++ )); do
 sleep 1 | echo -ne "${var:$i:1}"
done
echo ""
3
27.01.2020, 21:49

Ответ Горо будет работать, но следует отметить, что подстановка команды удаляет завершающие символы новой строки, как указано в стандарте POSIX . Таким образом, это может быть нежелательно, когда вы хотите фактически перебрать все символы, даже не -печатные. Другая проблема заключается в том, что стиль цикла C -используется в bash и ksh93, но не в стандарте (, также известном как POSIX -, совместимый)/bin/sh. Форма расширения параметра ${variable:index:offset}также является типом башизма и не специфицируется определениями расширения параметра POSIX (, хотя и поддерживается ksh93иzsh).

Тем не менее, есть способ перебирать все символы в файле переносимым и гораздо более практичным способом . Это использоватьawk:

# all characters on the same line
$ awk '{for(i=1;i<=length;i++){ printf "%c",substr($0,i,1); system("sleep 1");}; print}' input.txt

# all characters on separate lines
$ awk '{for(i=1;i<=length;i++){ print substr($0, i, 1); system("sleep 1"); }}' input.txt

С помощью этой команды substr()и system()оба указываются в POSIX awk и фактически перебирают все символы.

8
27.01.2020, 21:49

С помощью bashили ksh93вы можете читать отдельные символы с помощью встроенной в оболочку команды -в read:

while IFS= read -r -n 1 c; do 
  printf '%c' "$c"
  sleep 1
done < log.txt
printf '\n'
3
27.01.2020, 21:49

Вот решение на Python:

python -c "from time import sleep
with open('/tmp/file.txt') as f:
 for line in f:
  for c in line:
   print(c, end='', flush=True);sleep(1);"

Вы должны просто вставить это в командную строку и изменить имя входного файла.

1
27.01.2020, 21:49

Теги

Похожие вопросы