シェルスクリプトだとFizzBuzzが1行(ワンライナー)で書ける

Bash

はじめに

小ネタ。
シェルスクリプトでFizzBuzzを書いたらどんなふうにかけるかを試してみました。

検証環境

$ bash -version | head -n 1
GNU bash, バージョン 5.0.7(1)-release (x86_64-apple-darwin18.5.0)
$ sed --version | head -n 1
sed (GNU sed) 4.7

結果

$ seq 30 | sed '0~3s/[0-9]*$/Fizz/' | sed '0~5s/[0-9]*$/Buzz/'

実行結果は以下の通り。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

解説

はじめの seq は数字を列挙するために利用しています。

# 1から5までを出力
$ seq 5
1
2
3
4
5

30までの出力内容を後続する sed コマンドに引き渡しています。

  • sed では、 s内部コマンド で数値を除去しつつ行末に文字列を追加しています。
  • s の前方に対象行の指定を行っています。
    • 2つの sed コマンドはそれぞれ「先頭行から3行ずつ」、「先頭行から5行ずつ」処理を行っています。

ひとこと

ただただ楽。

Bash