私はテキストファイルをインポートし、画面上の特定の文字の幅に合わせて一度に1つずつ各行の中央に配置する方法を探しています。
たとえば、ユーザーがキーを押す前に最初の行を見てから、すべての行が表示されるまで次の行を表示する簡単なスライドショーに似ています。
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つの引数だけを取り、その関数を逆参照すると、$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
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セッションは不要で、一度に1行ずつ表示されます。前後に移動でき、最後の行以降に終了します。
答え3
速くて汚れた1行の内容は次のとおりです。
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
これは、ターミナルウィンドウが80×24であると仮定します。このsed
コマンドは、テキストの各行を中央に配置し、垂直に中央に配置するのに十分な先行および末尾の改行文字を追加します。このmore
コマンドを使用すると、ユーザーがページをめくることができます。