텍스트 파일에서 읽고 한 번에 한 문자씩 단어를 인쇄합니다.

텍스트 파일에서 읽고 한 번에 한 문자씩 단어를 인쇄합니다.

나는 텍스트 파일을 읽고 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다음 레코드를 가져오기 전에 현재 레코드를 자동으로 인쇄합니다.
  • $/=\1perl문자 크기가 1바이트라고 가정하면 입력 스트림은 한 번에 1바이트씩 읽혀집니다 .
  • $|=1출력을 버퍼링합니다.

관련 정보