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

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

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

예를 들어 사용자가 키를 누르기 전에 첫 번째 줄을 본 다음 모든 줄이 보일 때까지 다음 줄을 보는 간단한 슬라이드 쇼와 비슷합니다.

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 Shell에서 이 스크립트를 작성해 보았지만 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 from 화면 상단에서 화면 중앙으로 이동한 후 제가 차용한 방법으로 중앙선이 인쇄됩니다.여기.

다음은 사용자가 전달한 입력 파일을 읽고 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명령을 사용하면 사용자가 페이지를 넘길 수 있습니다.

관련 정보