我想编写一个程序,从文本文件中读取并Terminal
每秒逐个字符地打印该文件的单词。
例如,在一个文本文件中,log.txt
假设我有这句话:
I love Unix but I don't know programming.
我希望代码能够读取前一句并每秒一个一个地打印字母、空格。
答案1
五郎的回答会起作用,但应该注意的是命令替换会删除 POSIX 标准指定的尾随换行符。因此,在您想要实际迭代的地方可能并不理想全部字符,甚至是不可打印的字符。另一个问题是 C 风格的 for 循环在 bash 和 ksh93 中使用,但在标准(又名 POSIX-comliant )中不使用/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实际上会迭代所有字符。
答案2
你可以这样做
var=$(cat log.txt)
for (( i=0; i<${#var}; i++ )); do
sleep 1 | echo -ne "${var:$i:1}"
done
echo ""
答案3
通过bash
或 ,ksh93
您可以使用 shell 的内置read
命令读取单个字符:
while IFS= read -r -n 1 c; do
printf '%c' "$c"
sleep 1
done < log.txt
printf '\n'
答案4
您可以按Perl
如下所示执行此操作:
perl -pe 'BEGIN{$/=\1;$|=1;} sleep 1' log.txt
-p
将在获取下一条记录之前自动打印当前记录。$/=\1
将perl
一次读取输入流一个字节,并假设字符是一个字节大小。$|=1
将输出缓冲。