화면 중앙에서 한 번에 하나씩 텍스트 파일의 줄을 볼 수 있는 방법을 찾고 있습니다.

화면 중앙에서 한 번에 하나씩 텍스트 파일의 줄을 볼 수 있는 방법을 찾고 있습니다.

저는 텍스트 파일을 가져와 특정 문자 너비로 화면 중앙에 한 번에 하나씩 각 줄을 배치하는 방법을 찾고 있습니다.

기본 슬라이드 쇼와 비슷합니다. 예를 들어 사용자가 키를 누를 때까지 첫 번째 줄을 본 다음 모든 줄을 볼 때까지 다음 줄을 봅니다.

Bash에서 이를 수행하는 기본적인 방법이 있다고 생각하지만 아직 답변을 찾지 못했습니다.

답변1

그런 것 :

#!/usr/bin/env bash

if [ ! "$#" -eq 1 ]
then
    printf "Usage: %s <file>\n" "$0" >&2
    exit 1
fi

file="$1"

display_center(){
    clear
    columns="$(tput cols)"
    lines="$(tput lines)"
    down=$((lines / 2))
    printf '\n%.0s' $(seq 1 $down)
    printf "%*s\n" $(( (${#1} + columns) / 2)) "$1"
}

while IFS= read -r line
do
    display_center "$line"
    read -n 1 -s -r </dev/tty
done < "$file"

이름을 지정 centered.sh하고 다음과 같이 사용하십시오.

./centered.sh centered.sh

주어진 파일의 각 줄을 인쇄합니다. 다음 줄을 표시하려면 아무 키나 누르십시오. 아직 제대로 테스트되지 않았으므로 주의해서 사용하세요. 항상 화면 중앙에서 시작하여 줄을 인쇄하므로 아래쪽에 긴 줄이 더 많이 표시됩니다.

첫 번째 줄:

#!/usr/bin/env bash

오두막. env또한 나는그 특징. Bash를 피하고 POSIX 쉘에서 이 스크립트를 작성하려고 했지만 특히 read문제가 너무 많아서 포기했습니다. Bash가 어디에나 존재하는 것처럼 보일지라도 BSD나 Busybox가 있는 소규모 임베디드 시스템과 같이 기본적으로 모든 곳에 미리 설정되어 있지는 않다는 점을 명심해야 합니다.

이 부분에서는:

if [ ! "$#" -eq 1 ]
then
    printf "Usage: %s <file>\n" "$0" >&2
    exit 1
fi

사용자가 정확히 하나의 매개변수를 제공했는지 확인하고 그렇지 않은 경우 표준 오류에 사용 정보를 인쇄하고 1을 반환합니다. 이는 상위 프로세스에 대한 오류를 의미합니다.

여기

file="$1"

file사용자가 나중에 사용할 변수에 전달한 파일 이름 매개변수를 할당합니다 .

이것은 실제로 중앙 정렬된 텍스트를 인쇄하는 함수입니다.

display_center(){
    clear
    columns="$(tput cols)"
    lines="$(tput lines)"
    down=$((lines / 2))
    printf '\n%.0s' $(seq 1 $down)
    printf "%*s\n" $(( (${#1} + columns) / 2)) "$1"
}

Bash에는 함수 프로토타입이 없으므로 함수가 얼마나 많은 매개변수를 취하는지 미리 알 수 없습니다. 즉, 인쇄할 한 줄인 단 하나의 매개변수만 취하고 다음을 사용하여 역참조됩니다. $1이 함수는 먼저 화면을 지운 다음 한 줄씩 아래로 이동합니다. 2 화면 상단에서 화면 중앙에 도달한 다음 내가 빌린 방법을 사용하여 중심선을 인쇄합니다.여기.

이는 사용자가 전달한 입력 파일을 읽고 display_center()함수를 호출하는 루프입니다.

while IFS= read -r line
do
    display_center "$line"
    read -n 1 -s -r </dev/tty
done < "$file"

read터미널에서 오는 입력을 에코하지 않고 -n 1문자 하나만 읽는 데 사용됩니다 .-s-r백슬래시 맹글링 방지. read에서 자세한 내용을 알아볼 수 있습니다 help read. 또한 stdin이 이미 파일을 가리키고 있기 때문에 /dev/tty에서 직접 읽습니다. /dev/tty에서 읽도록 지시하지 않으면 read스크립트는 파일의 모든 줄을 매우 빠르게 인쇄하고 사용자가 읽을 때까지 기다리지 않고 즉시 종료됩니다. 키를 누르세요.

답변2

dialog패키지 로 할 수 있습니다 :

file=lorem                             #Path to the file to be displayed
ln=1                                   #Current line number to be displayed
nlines=$(wc -l "$file"|cut -f1 -d" ")  #Total number of lines of file
while [ "$ln" -le "$nlines" ]; do
    line=$(sed -n "$ln p" "$file")     #sed gets current line
    if dialog --yes-label Previous --no-label Next \
    --default-button no --yesno "$line" 5 100; then
        ln=$((ln-1))
    else
        ln=$((ln+1))
    fi
done

이것은 텍스트 기반 프레젠테이션(나는 "기본 슬라이드 쇼"를 진지하게 받아들였습니다!)이며 X 세션이 필요하지 않으며 한 번에 한 줄을 표시합니다. 뒤로 또는 앞으로 이동할 수 있으며 마지막 줄 이후에 끝납니다.

답변3

다음은 빠르고 더러운 한 줄입니다.

sed ':a;s/^.\{1,77\}$/ &/;ta;s/\( *\)\1/\1/; s/.*/\n\n\n\n\n\n\n\n\n\n\n&\n\n\n\n\n\n\n\n\n\n\n/' < input.txt | more

이는 80x24 터미널 창을 가정합니다. 이 sed명령은 텍스트의 각 줄을 중앙에 배치한 다음 세로로 중앙에 배치할 수 있도록 충분한 선행 및 후행 개행 문자를 추가합니다. 이 more명령을 사용하면 사용자가 페이지를 이동할 수 있습니다.

관련 정보