Imprimir arquivo Word for Word no keypress

0

Eu quero fazer o seguinte no bash: Eu tenho um arquivo de texto, e quero chamar um script que lê o arquivo, aguarda pressionamentos de tecla de mim e cada vez que um botão correto é pressionado, ele imprime exatamente uma palavra (a próxima palavra) do textfile.

Para elaborar: digamos que o arquivo de texto se parece com o seguinte

This is my
text file

e estou procurando por botões do teclado do grupo [[:print:]] . Então eu chamo meu script como ./script.sh textfile , então eu pressione "A" e o This aparece, então eu pressiono o botão Espaço, ainda só o This , então eu digito "O" e o is aparece, eu pressiono talvez "M" mais algumas vezes, até que todo o texto acima seja impresso e pronto.

O que eu já tenho:

Eu já sei esperar por um único pressionamento de tecla e, em seguida, fazer algo se funcionar:

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

Eu também sei ler um arquivo palavra por palavra: Leia o arquivo palavra por palavra (eu usei a resposta do usuário Lambert) A combinação dos dois não parece funcionar como eu quero, no entanto.

Se alguém tiver alguma ideia de como fazer isso, agradeceria muito. Além disso, por favor, note se eu fiz alguma coisa não clara / errada ou se eu perguntei no lugar errado / maneira.

Editar para esclarecimentos O Textfile pode conter um número arbitrário de linhas. Cada pressionamento de tecla deve imprimir palavras exatamente como está no Textfile, ou seja, conserva espaços e novas linhas (pense no script que quero alcançar como um cat atrasado que imprime o arquivo inteiro de uma só vez, mas apenas Word por Word no pressionamento de tecla)

    
por Pharguin 11.10.2018 / 09:52

1 resposta

0

Você não está muito longe para um arquivo de uma linha. Experimente os arrays e livre-se dos seus erros de sintaxe:

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

Para um arquivo de múltiplas linhas, tente

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

Você tem que dividir os descritores de arquivo de entrada para ler as linhas de texto sequencialmente e ler o terminal em paralelo.

    
por 11.10.2018 / 10:19