저는 텍스트 파일을 가져와 화면의 특정 문자 너비에 맞춰 한 번에 하나씩 각 줄의 중앙에 배치하는 방법을 찾고 있습니다.
예를 들어 사용자가 키를 누르기 전에 첫 번째 줄을 본 다음 모든 줄이 보일 때까지 다음 줄을 보는 간단한 슬라이드 쇼와 비슷합니다.
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
명령을 사용하면 사용자가 페이지를 넘길 수 있습니다.