ふと、文字列の一部分だけをecho-sdで囲むような処理を作ってシェル芸botで遊ぼうと思い立ったので、やってみることにした。 文字列の一部分って何だよとなるが、具体的には以下のような出力。
_人人人_
これが> 超 <ベジータだ!
 ̄Y^Y^Y^ ̄
じゃ、具体的にどうすればいいのかというと、以下のように一度echo-sdで囲む文字とそうでない文字で分解して、pasteで組み合わせたりしてやればいい。
sed -r 's/超/\necho-sd & \n/' <<<これが超ベジータだ!|sed -r '2!s/^/echo -e \\\\n/;s/.+/<(&)/'|eval paste `paste -{,,}`|sed 2\!s/^/`printf %.s {1..3}`/|tr -d \\t
blacknon@BS-PUB-UBUNTU-01:~$ # 文字列を分解
blacknon@BS-PUB-UBUNTU-01:~$ sed -r 's/超/\necho-sd & \n/' <<<これが超ベジータだ!
これが
echo-sd 超
ベジータだ!
blacknon@BS-PUB-UBUNTU-01:~$ # echo-sd以外の箇所について頭にechoを付与
blacknon@BS-PUB-UBUNTU-01:~$ sed -r 's/超/\necho-sd & \n/' <<<これが超ベジータだ!|sed -r '2!s/^/echo -e \\\\n/;s/.+/<(&)/'
<(echo -e \\nこれが)
<(echo-sd 超 )
<(echo -e \\nベジータだ!)
blacknon@BS-PUB-UBUNTU-01:~$ # プロセス置換にしている各要素をpasteで結合
blacknon@BS-PUB-UBUNTU-01:~$ sed -r 's/超/\necho-sd & \n/' <<<これが超ベジータだ!|sed -r '2!s/^/echo -e \\\\n/;s/.+/<(&)/'|eval paste `paste -{,,}`
_人人人_
これが > 超 < ベジータだ!
 ̄Y^Y^Y^ ̄
blacknon@BS-PUB-UBUNTU-01:~$ # 吹き出しのある1,3行目について、全角スペースでパディング
blacknon@BS-PUB-UBUNTU-01:~$ sed -r 's/超/\necho-sd & \n/' <<<これが超ベジータだ!|sed -r '2!s/^/echo -e \\\\n/;s/.+/<(&)/'|eval paste `paste -{,,}`|sed 2\!s/^/`printf %.s {1..3}`/
_人人人_
これが > 超 < ベジータだ!
 ̄Y^Y^Y^ ̄
blacknon@BS-PUB-UBUNTU-01:~$ # タブを削除
blacknon@BS-PUB-UBUNTU-01:~$ sed -r 's/超/\necho-sd & \n/' <<<これが超ベジータだ!|sed -r '2!s/^/echo -e \\\\n/;s/.+/<(&)/'|eval paste `paste -{,,}`|sed 2\!s/^/`printf %.s {1..3}`/|tr -d \\t
_人人人_
これが> 超 <ベジータだ!
 ̄Y^Y^Y^ ̄
これで、文字列の一部だけを吹き出し表示できたりする。 応用すれば、以下のように一文字ずつecho-sdで囲んだ文字列を連続で作成したりもできる。
seq 6|xargs -I@ bash -c 'echo プレミアムフライデー|sed -r "s/[^フ]|フライデー/\necho-sd &ッ!\n/@"|sed '\''/echo-sd/!s/^/echo -e \\\\n/g;;s/^/<(/g;s/$/)/g'\''|eval paste $(paste - - -)|sed '\''s/\t//g;2!s/^/'\''$(printf " %.s" {1..@})'\''/g;s/^ //g'\'''
blacknon@BS-PUB-UBUNTU-01:~$ seq 6|xargs -I@ bash -c 'echo プレミアムフライデー|sed -r "s/[^フ]|フライデー/\necho-sd &ッ!\n/@"|sed '\''/echo-sd/!s/^/echo -e \\\\n/g;;s/^/<(/g;s/$/)/g'\''|eval paste $(paste - - -)|sed '\''s/\t//g;2!s/^/'\''$(printf " %.s" {1..@})'\''/g;s/^ //g'\'''
_人人人人人_
> プッ! <レミアムフライデー
 ̄Y^Y^Y^Y^Y^ ̄
_人人人人人_
プ> レッ! <ミアムフライデー
 ̄Y^Y^Y^Y^Y^ ̄
_人人人人人_
プレ> ミッ! <アムフライデー
 ̄Y^Y^Y^Y^Y^ ̄
_人人人人人_
プレミ> アッ! <ムフライデー
 ̄Y^Y^Y^Y^Y^ ̄
_人人人人人_
プレミア> ムッ! <フライデー
 ̄Y^Y^Y^Y^Y^ ̄
_人人人人人人人人人_
プレミアム> フライデーッ! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
昔なつかしの某炭酸飲料のCMのよみがなを吹き出しで出力させたりもできる。
seq 5|xargs -I@ bash -c 'sed -r "s/[^古鬱]|古鬱/\necho-sd \$(echo &|sed -e{y#吐露非#トロピ#,s#狩#カル#,s#古鬱#フルーツ#})!\n/@" 吐露非狩古鬱|sed -r "2!s/^/echo -e \"\\\n\"/;s/.+/(&)/"|eval paste `paste -{,,}`|sed 2\!s/^/`printf %.s {1..@}`/'|sed s/^ //|tr -d \\t #シェル芸
— Blacknon@通勤電車リハビリ中 (@blacknon_) 2018年7月28日
blacknon@BS-PUB-UBUNTU-01:~$ seq 5|xargs -I@ bash -c 'sed -r "s/[^古鬱]|古鬱/\necho-sd \$(echo &|sed -e{y#吐露非#トロピ#,s#狩#カル#,s#古鬱#フルーツ#})!\n/@" <<<吐露非狩古鬱|sed -r "2!s/^/echo -e \"\\\n\"/;s/.+/<(&)/"|eval paste `paste -{,,}`|sed 2\!s/^/`printf %.s {1..@}`/'|sed s/^ //|tr -d \\t
_人人人人_
> ト! <露非狩古鬱
 ̄Y^Y^Y^Y^ ̄
_人人人人_
吐> ロ! <非狩古鬱
 ̄Y^Y^Y^Y^ ̄
_人人人人_
吐露> ピ! <狩古鬱
 ̄Y^Y^Y^Y^ ̄
_人人人人人_
吐露非> カル! <古鬱
 ̄Y^Y^Y^Y^Y^ ̄
_人人人人人人人_
吐露非狩> フルーツ! <
 ̄Y^Y^Y^Y^Y^Y^Y^
ちなみに、シェル芸botにはコマンドの出力から画像やGIFを生成するスクリプトが入ってるので、それを利用すれば以下のようにGIFにして遊ぶこともできる。
https://t.co/7xmTmhUnxq pic.twitter.com/DkNZeB3oQM
— シェル芸bot (@minyoruminyon) 2018年7月27日
https://t.co/X2KmNHwF4A pic.twitter.com/hGVT9AufHT
— シェル芸bot (@minyoruminyon) 2018年7月28日
…まぁ、特にこれができたところで何の役にも立たないのだけど(´・ω・`)。 そこは気にしてはいけない。