コピペコードで快適生活

明日使えるソースを自分のために

第37回シェル芸勉強会メモ

https://b.ueda.tech/?post=20180901_shellgei_37 にて学んだことメモ。

Q1

FizzBuzzのアニメーション

seq 100 | 
gsed '0~3s/.*/Fizz/;0~5s/.*/Buzz/;0~15s/.*/FizzBuzz/' | # 0~3s みたいな書き方で3行ごとに置換を行う
gawk '{printf("%08s\n", $1)}' |  # 8桁で右揃えにする
while read line; do clear; echo $line; sleep 0.5; done # でもこれだと右揃え表示されない...

Q2

フリーメイソン

echo '   /\' | sed ':a p;s@ /@/  @;b a' | head -n 4 | sed '$a ̄ ̄ ̄ ̄' | sed '3s;/   ;/ 👁 ;'

sedで何やっているのかわからないので、プロに教えていただいた。

# aコマンドで指定行のあとに文字列を差し込める。
# $a だと最終行に差し込む
echo "hoge" | gsed '1a\fuga'
hoge
fuga


# sの後につけた文字がデリミタになる
# @を使った例
echo '//' | gsed 's@/@pp/@'
pp//

# sedで無限ループ
# :aはラベル pは出力
# s@hoge@hogehoge@ で 置換(デリミタを@にしている)
# bはラベルジャンプの意味。なので、b a でaラベルへジャンプ
echo "hoge" | gsed ':a p;s@hoge@hogehoge@;b a' | head -n 5
hoge
hogehoge
hogehogehoge
hogehogehogehoge
hogehogehogehogehoge

# 3sとやると3行目だけ置換する
echo "hoge" | gsed ':a p;s@hoge@hogehoge@;b a' | head -n 5 | gsed "3s/hoge/fuga/g"
hoge
hogehoge
fugafugafuga
hogehogehogehoge
hogehogehogehogehoge

Q3

3桁の中に同じ数がなく、各桁を足すと15になる数字。ゼロは含まない。
これは簡単。

seq -w 999 | grep -v "0" | gawk -v FS="" '($1!=$2 && $2!=$3 && $1 + $2 + $3 == 15){print $1$2$3}'

補足

seq -w 999 # これでゼロパディングできる
gawk -v FS="" {} # これで1文字ごとに区切れる。