ふと、文字列の一部分だけを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

shell
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で囲んだ文字列を連続で作成したりもできる。

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'\'''
shell
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のよみがなを吹き出しで出力させたりもできる。

shell
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にして遊ぶこともできる。

…まぁ、特にこれができたところで何の役にも立たないのだけど(´・ω・`)。 そこは気にしてはいけない。