这是一个可以帮助您的函数(在 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.
希望这可以帮助!