加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 使用printf格式化输出:截断或填充

发布时间:2020-12-15 22:20:05 所属栏目:安全 来源:网络整理
导读:我想产生以下输出: Avril Stewart 99 54 Sally Kinghorn 170 60 John Young 195 120 Yutte Schim... 250 40 如您所见,短于14个字符的名称将用空格填充.截断超过15个字符的名称:’Yutte Schimmelpenninck’截断为’Yutte Schim ……’. 这是我试图实现的目
我想产生以下输出:

> Avril Stewart  99  54
> Sally Kinghorn 170 60
> John Young     195 120
> Yutte Schim... 250 40

如您所见,短于14个字符的名称将用空格填充.截断超过15个字符的名称:’Yutte Schimmelpenninck’截断为’Yutte Schim ……’.

这是我试图实现的目标(变量$name,$height和$weight从文件中提取,循环在每个文件数据上运行printf命令):

printf '%-14s -%3s -%3sn' "$name" "$height" "$weight"
> Avril Stewart  99  54
> Sally Kinghorn 170 60
> John Young     195 120
> Yutte Schimmelpenninck 250 40

printf单线是理想的解决方案.

什么代码会产生第一个输出块?

解决方法

在printf命令之前,您要检查名称是否超过14个字符,如果是,则截断它并用点替换最后三个字符.这个命令可以做到:

(( ${#name} > 14 )) && name="${name:0:11}..."

它用前十一个字符替换名称并附加….

您还必须修复printf格式字符串:而不是

'%-14s -%3s -%3sn'

它一定要是

'%-14s %-3s -%-3sn'

或者你得到的结果如

Avril Stewart  - 99 - 54

也许这只是一个错字,因为你的示例输出没有连字符.

总而言之:

$name='Avril Stewart'; weight=99; height=54
$(( ${#name} > 14 )) && name="${name:0:11}..."
$printf '%-14s %-3s %-3sn' "$name" $weight $height
Avril Stewart  99  54
$name='Sally Kinghorn'; weight=170; height=60
$(( ${#name} > 14 )) && name="${name:0:11}..."
$printf '%-14s %-3s %-3sn' "$name" $weight $height
Sally Kinghorn 170 60
$name='Yutte Schimmelpeninck'; weight=250; height=40
$(( ${#name} > 14 )) && name="${name:0:11}..."
$printf '%-14s %-3s %-3sn' "$name" $weight $height
Yutte Schim... 250 40

因此,如果您从文件中读取此内容,例如以逗号分隔,则最终会得到如下循环:

while IFS=,read -r name weight height; do
    (( ${#name} > 14 )) && name="${name:0:11}..."
    printf '%-14s %-3s %-3sn' "$name" $weight $height
done < inputFile

导致

Avril Stewart  99  54
Sally Kinghorn 170 60
John Young     195 120
Yutte Schim... 250 40

我认为这不可能是单线.我尝试了三元运算符并尝试了类似的东西

printf '%sn' $(( ${#name} > 14 ? "${name:0:11}..." : "$name" ))

但这里的问题是它只适用于整数,并且字符串在算术上下文中扩展为零.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读