第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文字ごとに区切れる。