나는 텍스트 파일을 읽고 Terminal
매초마다 해당 파일의 단어를 문자별로 인쇄하는 프로그램을 작성하고 싶습니다.
예를 들어 텍스트 파일에 log.txt
다음 문장이 있다고 가정해 보겠습니다.
I love Unix but I don't know programming.
이전 문장을 읽고 문자, 공백을 1초마다 하나씩 인쇄하는 코드를 원합니다.
답변1
고로의 대답작동할 것입니다. 그러나 주의해야 할 점은명령 대체는 POSIX 표준에 지정된 후행 줄 바꿈을 제거합니다.. 따라서 실제로 반복하려는 경우 이상적이지 않을 수 있습니다.모두문자, 심지어 인쇄할 수 없는 문자도 마찬가지입니다. 또 다른 문제는 C 스타일 for 루프가 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모든 문자는 실제로 반복됩니다.
답변2
당신은 이것을 할 수 있습니다
var=$(cat log.txt)
for (( i=0; i<${#var}; i++ )); do
sleep 1 | echo -ne "${var:$i:1}"
done
echo ""
답변3
bash
또는 다음 과 함께 셸의 내장 명령을 사용하여 개별 문자를 읽을 ksh93
수 있습니다 .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바이트라고 가정하면 입력 스트림은 한 번에 1바이트씩 읽혀집니다 .$|=1
출력을 버퍼링합니다.