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