よく、Twitterにあるシェル芸bot(フォローされてたら「#シェル芸」 というハッシュタグ付きのツイートをつぶやくとそのシェル芸を実行して結果を引用リツイートで出してくれるボット)というボットで遊んでるのだけど、そこでよく遊んでたシェル芸を残してなかったので、備忘。
シェル芸botには、super_unkoなるうんこ関係のコマンドを詰め合わせてるうんこづくしなリポジトリがあって、その中にアスキーアートのうんこを生成するunko.towerというコマンドが存在している。
unko.tower N
今回は、このunko.towerのうんこの中や背景に任意のテキストを差し込んでいく。
1. うんこの中にテキストを差し込む
うんこの中にテキストを差し込む場合、以下のようにコマンドを実行する。
unko.tower 4 | sed -r ":a;s/(( *) /\\1_/;ta" | eval sed -z -e'"s/_/"'{$(echo うんこの中にめっせぇじをいれるよ!こんな感じだよ|sed "s/./&,/g;s/,$//g")}'"/"'
ちょっと解説つけたのが以下。
# unko.towerを生成する
unko.tower 4 | \\
sed -r ":a;s/(( *) /\\1_/;ta" | # うんこの中の全角空白を全角アンダーバーにする \\
eval sed -z -e'"s/_/"'{$(echo うんこの中にめっせぇじをいれるよ!こんな感じだよ|sed "s/./&,/g;s/,$//g")}'"/"' # メッセージをコマンド置換内でブレース展開できるように加工して、それをsedを使って一文字ずつ置換させる
2. うんこの背景にテキストを差し込む
うんこの中ではなく、うんこの背景にテキストを差し込む場合、以下のようにコマンドを実行する。
unko.tower 5|sed -r ':a;s/(( *) /\\1_/;ta'|awk '{printf($0);for(i=length($0);i<=14;i++){printf(" ")};print ""}'|eval sed -z -e'"s/ /"'{$(echo それはうんこというにはあまりにも大きすぎた。大きく、分厚く、重くそして大雑把すぎた。それはまさにうん塊だった|sed 's/./&,/g;s/,$//g')}'"/"'
ちょっと解説をつけたのが以下。
unko.tower 5 | # unko.towerを生成する \\
sed -r ':a;s/(( *) /\\1_/;ta' | # うんこの中の全角空白を全角アンダーバーに置換 \\
awk '
{
printf($0);
for(i=length($0);i<=14;i++){printf(" ")};
print ""}
' | # awkで行を空白でパディング(デフォルトでは行の末尾にはメッセージに置換するための空白がないため) \\
eval sed -z -e'"s/ /"'{$(echo それはうんこというにはあまりにも大きすぎた。大きく、分厚く、重くそして大雑把すぎた。それはまさにうん塊だった|sed 's/./&,/g;s/,$//g')}'"/"' # メッセージをコマンド置換内でブレース展開できるように加工して、それをsedを使って一文字ずつ置換させる
3. テキストを動かしてみる
シェル芸botには、animationというImageMagickのconvertを利用したGifの生成コマンドがある。 これを利用することで、うんこの中、外においたテキストを動かすこともできる。いくつかサンプルをおいておく。
以下、サンプルコード。
echo 我は関うん長!この青龍うん月刀の切れ味をみよ!|sed ':a;p;s/\\(.\\)\\(.*\\)/\\2\\1/;ba'|head -26|xargs -I@ bash -c 'unko.tower 3|sed -r ":a;s/(( *) /\\1_/;ta"|eval sed -z -e$'\\x27'"s/_/"$'\\x27'{$(echo @|sed "s/./&,/g;s/,$//g")}$'\\x27'"/"$'\\x27' -e"s/_/!/g"'|animation -l 4
echo それはうんこというにはあまりにも大きすぎた。大きく、分厚く、重くそして大雑把すぎた。それはまさにうん塊だった。|sed ':a;p;s/\\(.\\)\\(.*\\)/\\2\\1/;ba'|head -56|xargs -I@ bash -c 'unko.tower 3|sed -r ":a;s/(( *) /\\1_/;ta"|awk "{printf(\\$0);for(i=length(\\$0);i<=10;i++){printf(\\" \\")};print \\"\\"}"|eval sed -z -e$'\\x27'"s/ /"$'\\x27'{$(echo @|sed "s/./&,/g;s/,$//g")}$'\\x27'"/"$'\\x27''|animation -l 4
echo うんこの中にめっせぇじを入れて想いを伝えよう! | grep -o . | awk '{a=a$0;printf("%-24s\\n",a)}' | sed 's/ /_/g' | xargs -I@ bash -c 'unko.tower 4|sed -r ":a;s/(( *) /\\1_/;ta"|eval sed -z -e$'\\x27'"s/_/"$'\\x27'{$(echo @|sed "s/./&,/g;s/,$//g")}$'\\x27'"/"$'\\x27'' | animation -l 5