ふと、文字列の一部分だけをecho-sdで囲むような処理を作ってシェル芸botで遊ぼうと思い立ったので、やってみることにした。 文字列の一部分って何だよとなるが、具体的には以下のような出力。
shell_人人人_ これが> 超 <ベジータだ!  ̄Y^Y^Y^ ̄
じゃ、具体的にどうすればいいのかというと、以下のように一度echo-sdで囲む文字とそうでない文字で分解して、pasteで組み合わせたりしてやればいい。
bash
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
shellblacknon@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で囲んだ文字列を連続で作成したりもできる。
bash
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'\'''
shellblacknon@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日
shellblacknon@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日
…まぁ、特にこれができたところで何の役にも立たないのだけど(´・ω・`)。 そこは気にしてはいけない。