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
또한 파일을 그대로 읽는 방법도 알고 있습니다.파일을 그대로 읽기(나는 Lambert 사용자의 답변을 사용했습니다.) 하지만 둘의 조합이 내가 원하는 방식으로 작동하지 않는 것 같습니다.
누구든지 이 작업을 수행하는 방법을 알고 있다면 감사하겠습니다. 또한 제가 질문한 내용 중 불분명하거나 잘못된 내용이 있거나, 잘못된 위치/방법으로 질문한 경우 지적해 주시기 바랍니다.
명확히 하기 위해 편집됨
텍스트 파일에는 원하는 수의 행이 포함될 수 있습니다. 키를 누를 때마다 다음 단어가 인쇄되어야 합니다.정확히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
텍스트 줄을 순차적으로 읽고 터미널에서 병렬로 읽으려면 입력 파일 설명자를 분할해야 합니다.