これがあなたを助けることができる機能です(bashで):
print_padded() {
local header=$1
local msg=( $2 )
local width=$3
local headerlength=${#header}
local i=0
local spaceleft=$((width-headerlength))
local defaultspace=20
(((spaceleft<0) && (spaceleft=defaultspace)))
local buf=()
local s
printf "%s" "$header"
while ((i<${#msg[@]})); do
if ((${#msg[i]}+1<=spaceleft)); then
printf " %s" "${msg[i]}"
((spaceleft-=${#msg[i++]}+1))
else
echo
(((spaceleft=width-headerlength)<0 && (spaceleft=defaultspace)))
while ((${#msg[i]}>=spaceleft)); do
(((s=width-${#msg[i]})<0 && (s=0)))
printf "%${s}s%s\n" '' "${msg[i++]}"
done
printf "%${headerlength}s" ''
fi
done
echo
}
次に、次のように使用します。
$ # Demo with 40 columns...
$ msg="Writing a log file entry that is wrapped onto the next line with appropriate formatting..."
$ print_padded "[2012-12-27@15:56:43 test.sh] ->" "$msg" 40
[2012-12-27@15:56:43 test.sh] -> Writing
a log
file
entry
that is
wrapped
onto
the
next
line
with
appropriate
formatting...
$ # Demo with 60 columns:
$ loremipsum="Lorem ipsum dolor sit amet, consectetur adipiscing \
elit. Duis erat purus, vestibulum non sollicitudin ornare, aliquam \
nec mi. In vulputate velit ut felis porta tincidunt. Integer odio \
odio, ullamcorper id ultricies a, fermentum vitae augue. \
Nunc sapien ipsum, dignissim sit amet eleifend eu, suscipit sed eros. \
In hac habitasse platea dictumst. Morbi feugiat interdum ligula \
eu consectetur. Sed congue lacinia felis, a adipiscing nibh \
aliquam in. Vestibulum ante ipsum primis in faucibus orci luctus \
et ultrices posuere cubilia Curae; Proin faucibus ultrices tincidunt."
$ print_padded "loremipsum ->" "$loremipsum" 60
loremipsum -> Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Duis erat purus, vestibulum
non sollicitudin ornare, aliquam nec mi. In
vulputate velit ut felis porta tincidunt.
Integer odio odio, ullamcorper id ultricies a,
fermentum vitae augue. Nunc sapien ipsum,
dignissim sit amet eleifend eu, suscipit sed
eros. In hac habitasse platea dictumst. Morbi
feugiat interdum ligula eu consectetur. Sed
congue lacinia felis, a adipiscing nibh
aliquam in. Vestibulum ante ipsum primis in
faucibus orci luctus et ultrices posuere
cubilia Curae; Proin faucibus ultrices
tincidunt.
ここで、メッセージに形式のジャンク (カラー コードなど) が含まれていないことを願っています。そうしないと、このスクリプトは惨めに失敗します。
単語ごとに改行します(スペースで)。最初の出力でわかるように、行が長すぎて収まらない場合は、(可能であれば) 独自の行に揃えて配置されます。
単語の途中で改行することを気にしない場合は、はるかに簡単です。
print_padded() {
local header=$1
local msg=$2
local width=$3
local headerlength=${#header}
local i
local msgspace=$((width-headerlength))
(((msgspace<0) && (msgspace=20)))
printf "%s %s\n" "$header" "${msg:$i:$msgspace}"
for ((i=msgspace;i<${#msg};i+=msgspace)); do
printf "%${headerlength}s %s\n" '' "${msg:$i:$msgspace}"
done
}
それで:
$ # Demo with 40 columns...
$ msg="Writing a log file entry that is wrapped onto the next line with appropriate formatting..."
$ print_padded "[2012-12-27@15:56:43 test.sh] ->" "$msg" 40
[2012-12-27@15:56:43 test.sh] -> Writing
a log fi
le entry
that is
wrapped
onto th
e next l
ine with
appropr
iate for
matting.
$ # Demo with 60 columns:
$ loremipsum="Lorem ipsum dolor sit amet, consectetur adipiscing \
elit. Duis erat purus, vestibulum non sollicitudin ornare, aliquam \
nec mi. In vulputate velit ut felis porta tincidunt. Integer odio \
odio, ullamcorper id ultricies a, fermentum vitae augue. \
Nunc sapien ipsum, dignissim sit amet eleifend eu, suscipit sed eros. \
In hac habitasse platea dictumst. Morbi feugiat interdum ligula \
eu consectetur. Sed congue lacinia felis, a adipiscing nibh \
aliquam in. Vestibulum ante ipsum primis in faucibus orci luctus \
et ultrices posuere cubilia Curae; Proin faucibus ultrices tincidunt."
$ print_padded "loremipsum ->" "$loremipsum" 60
loremipsum -> Lorem ipsum dolor sit amet, consectetur adipisc
ing elit. Duis erat purus, vestibulum non solli
citudin ornare, aliquam nec mi. In vulputate ve
lit ut felis porta tincidunt. Integer odio odio
, ullamcorper id ultricies a, fermentum vitae a
ugue. Nunc sapien ipsum, dignissim sit amet ele
ifend eu, suscipit sed eros. In hac habitasse p
latea dictumst. Morbi feugiat interdum ligula e
u consectetur. Sed congue lacinia felis, a adip
iscing nibh aliquam in. Vestibulum ante ipsum p
rimis in faucibus orci luctus et ultrices posue
re cubilia Curae; Proin faucibus ultrices tinci
dunt.
お役に立てれば!