FizzBuzz at ターミナル!
FizzBuzzとは?
Wikipediaに説明は任せます(笑)
簡単にいうと、以下のような出力を目指します
1 2 Fizz 4 Buzz Fizz ... 14 FizzBuzz 16 ...
まず1から100までの数字を連続で出力する
seq
コマンドを使用する
$ seq 100 1 2 3 ...
5の倍数の処理
置換なのでsed
を用いる
$ seq 100 | sed '5~5s@.*@Buzz@g'
.*
は任意の文字列の0文字以上のパターンにマッチします
3の倍数の処理
$ seq 100 | sed '5~5s@.*@Buzz@' \ | sed '3~3s@[0-9]*@Fizz@'
[0-9]*
で、任意の数字にマッチさせてます。
15の倍数のところの説明
ここがちょっとテクい(?)のですが、*
は直前のパターンを0文字以上なので、0文字にもマッチします(0字マッチ)。
すでに5の倍数の処理を終えているので、15の倍数のところにはBuzzが入っていますが、BuzzのBの手前にマッチします。
そしてそのマッチしたものがFizzに置換されるので、結果としてFizzBuzzを得ます。
おわりに
結果をまとめておきます
$ seq 100 | sed '5~5s@.*@Buzz@' | sed '3~3s@[0-9]*@Fizz@'
0字マッチの部分はなかなか捉えるのが難しいと思います。以下の例なども参考にしてみてください。
$ echo abc | sed 's/b*/1/g' 1a1c1