Diary

Diary

日々学んだことをアウトプットする場として初めてみました

FizzBuzz at ターミナル(ワンライナー)!

FizzBuzz at ターミナル!

FizzBuzzワンライナーでやってみる

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