Ansatzの備忘録

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

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

問題19 シェルの機能を利用したファイルの上書き

問題のファイルは

https://github.com/shellgei/shellgei160

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

cardno ファイルの先頭8桁の数字をxでマスクする問題だった。配列を使えばできそうだと思ったが連想配列と配列が頭の中でごちゃ混ぜになってうまく正解できなかった。

正解例は

printf xxxx-xxxx 1<> cardno

だが、なぜこれでうまくいくのかわからない。ファイルの中身が xxxx-xxxx だけにならないのはファイルが入力に備えて消去されないからという説明がされていたが、それがよくわからない。単にファイルの先頭に(あるいは末尾に) xxxx-xxxx が追加されるということにならないのはなぜだろうか。 printf で出力しようとしている文字の分がファイルの中身の一部とうまく置き換わってくれるという話は man bash の中を検索してもそれらしき記述が見当たらない。仕方がないのでひとまず放置する。

別解として

IFS=-;a=($(<cardno));echo xxxx-xxxx-${a[2]}-${a[3]} > cardno

というのがある。こっちのほうが何をしているかわかりやすくてよい。