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" )) 但这里的问题是它只适用于整数,并且字符串在算术上下文中扩展为零. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |