Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題39

問題39 文章の折り返し

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

30文字で文章を折り返す問題だった。

解答例は

cat bash_description.txt | sed 's/ / \n/g;s/$/ /' | awk '{L+=length}L>31{print "";L=length}{printf $0}' | awk 'sub(/ $/,"")'

となる。まず1単語1行となるように sed で変換する。そして2番目の awk では、最初のアクションで単語の長さを加える。次のアクションで累計の単語の長さが31を超えたらprint "" で改行を入れる。最後の printf では改行なしで単語を出力する。これによって文字幅30字を超えるまでは改行なしで単語が並び、超えたら改行されて次に行くという動作が実現する。最後の awk では awk を通すことで改行が入ることを活かして最終行に改行を入れつつ、最後尾の余計な空白を除去している。