按键时逐字打印文件

按键时逐字打印文件

我想在 bash 中执行以下操作:我有一个文本文件,并且想要调用一个读取该文件的脚本,等待我的击键,每次按下正确的按钮时,它都会打印出一个单词(下一个单词)文本文件。

详细说明:让我们假设文本文件如下所示

This is my
text file

我正在寻找该组的键盘按钮[[:print:]]。所以我称我的脚本为 ./script.sh textfile,然后我按“A”并This出现,然后我按空格按钮,仍然只有This,然后我键入“O”并is出现,我可能会再按“M”几次,直到上面的所有文字都已打印,我就完成了。

我已经拥有的:

我已经知道如何等待单个按键,然后在有效时执行某些操作:

while true; do
  read -rsn1 input
    if [[ "$input" =~ "[[:print]]" ]]; then
     # do stuff on keypress
    fi
done

我还知道如何逐字读取文件:逐字读取文件(我使用了用户兰伯特的回答)但这两者的组合似乎并没有按照我想要的方式工作。 

如果有人知道如何做到这一点,我将不胜感激。另外,如果我确实提出了任何不清楚/错误的内容,或者我是否在错误的地方/方式提出了问题,请指出。

编辑以澄清 文本文件可以包含任意数量的行。每个按键都应该打印单词确切地就像它在文本文件中一样,即它节省了空格和换行符(将我想要实现的脚本想象为一个延迟的脚本,cat它不是一次打印整个文件,而是仅在击键时逐字打印)

答案1

对于单行文件来说,你已经不远了。尝试数组并消除语法错误:

read -a TMPARR < file
while read -n1 CH && [[ $CNT -lt ${#TMPARR[@]} ]]; do [[ "$CH" =~ [[:print:]] ]] && echo ${TMPARR[((CNT++))]}; done

对于多行文件,请尝试

while read -a TMPARR <&3
   do   CNT=0
        [[ $CNT -lt ${#TMPARR[@]} ]] && read -sn1 CH
        while read -sn1 CH && [[ $CNT -lt ${#TMPARR[@]} ]]
          do [[ "$CH" =~ [[:print:]] ]] && echo ${TMPARR[((CNT++))]}
          done
   done  3< file

您必须拆分输入文件描述符才能顺序读取文本行并并行从终端读取。

相关内容