コマンドの前にprintf
、名前が 14 文字を超えているかどうかを確認し、14 文字を超えている場合は切り捨てて、最後の 3 文字をドットに置き換えます。このコマンドは次のことを行います。
(( ${#name} > 14 )) && name="${name:0:11}..."
name
最初の 11 文字に置き換えて、 を追加し...
ます。
フォーマット文字列も修正する必要がありprintf
ます。代わりに
'%-14s -%3s -%3s\n'
そうでなければならない
'%-14s %-3s -%-3s\n'
または、次のような結果が得られます
Avril Stewart - 99 - 54
ただし、出力例にはハイフンが含まれていなかったため、単なるタイプミスだった可能性があります。
概して:
$ name='Avril Stewart'; weight=99; height=54
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Avril Stewart 99 54
$ name='Sally Kinghorn'; weight=170; height=60
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Sally Kinghorn 170 60
$ name='Yutte Schimmelpeninck'; weight=250; height=40
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Yutte Schim... 250 40
したがって、これをファイルから読み取ると、たとえばカンマ区切りで、次のようなループになります。
while IFS=, read -r name weight height; do
(( ${#name} > 14 )) && name="${name:0:11}..."
printf '%-14s %-3s %-3s\n' "$name" $weight $height
done < inputFile
その結果
Avril Stewart 99 54
Sally Kinghorn 170 60
John Young 195 120
Yutte Schim... 250 40
ワンライナーでは無理だと思います。三項演算子を試して、次のようなものを試しました
printf '%s\n' $(( ${#name} > 14 ? "${name:0:11}..." : "$name" ))
ただし、ここでの問題は、整数に対してのみ機能し、文字列は算術コンテキストでゼロに展開されることです。