BobbyQuineのブログ(備忘録)

Linux関係の備忘録、その他タバコ、Vape関連なんかも。

シェル芸

個人的シェル芸置き場

 

zshでは

 

% echo {а..я}

а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я

 

とできる。しかしこれをBashに同様にコマンドを打ち込んでも実行されず

{а..я}

という出力が得られる。そこで"echo а я"からはじめてzshと同様の出力結果が得られるかやってみた。

 

$ echo а я|sed -e "s/^/print(\'/" -e "s/\$/\'\.encode(\'unicode_escape\'))/"|python3.6|sed -e 's/[^0-9,a-f, ]//g' -e 's/b//' -e s/^/0x/ -e "s/ / 0x/"|seq $(cat)|echo "obase=16; ibase=10; $(cat)"|bc|sed "s/^/\\\u/g"|echo -e $(cat)

 

一応ツイッターに収まったのでシェル芸botにいつだったか投げた。これについてpythonを使わずにやる方法探してるなう。

※追記:Python更新で3.7になった。書き換えて実効。

 

とあるディレクトリにあるmp4ファイルをvlcでランダム順に再生する。

lsの-Qオプションを始めて使ったので記念に。なお、ファイル群の名前が特殊文字を含まない場合はこのオプションはいらない

 

$ ls -Q | grep mp4 | sort -R |xargs vlc

 

いい加減shufコマンド覚えたい

 

2018/9/9

https://www.slideshare.net/kanata1/unicode-112630484

こちらのスライドを読ませていただき、Unicodeのおもしろさを知りました(ついでに闇の深さも)。まぁ、というわけでちょっと遊んだのを記録しとこうって感じで。

 

$ echo sedですべての文字の後ろにスペース追加する方法が相変わらず分からない|sed -e "s/^/print(\'/" -e "s/\$/\'\.encode(\'unicode_escape\'))/"|python3.7|sed s/b\'//|sed s/\'//|tr '\\' '\n'|sed '/^$/d'|sed -e "s/\$/\\\U3099\\\U0489/g" -e "s/u/\\\U/g"|sed -z "s/\n//g"|sed -e "s/^/echo \$\'/" -e "s/\$/\'/"|bash

 

未だにsedコマンドが使いこなせず、すべての文字の後ろに共通の文字を追加する方法が分からないorz

Unicode表はWikipediaにあるので、それを見て色々遊んでみたいと思う

 

2018/9/10

どうにも一つ前のシェル芸では英字箇所がうまくいかないことが分かったので。文章に取り消し線を入れるシェル芸。

$ echo test tweet | sed -e "s/\(.\)/\1\\n/g"|sed -e "s/\$/$'\\\U336'/g" -e 1"s/^/echo /"|sed -z "s/\n//g"|bash

 

なお、これはようやくsedで一文字ずつ改行する方法を見つけたのでそれを使った。

sed使いこなせないおじさん、一歩成長

 

2019/01/19

何でか知らんがFizzBuzz問題がTLで話題に。実は今までFizzBuzzをシェル芸でやったことがなかったのでやってみた。

$ seq 1 100|sed -e 0~15cFizzBuzz -e 0~3cFizz -e 0~5cBuzz

 

はい、なんか皆さんがやってるほど長くならなくて実はルール違反しているのでは??って感じなんだけど実際どうなんだろ。

 

2020/02/13

seq 1 7|tac|nl|awk '{if ($1 > $2) print $2,$1;else print $1,$2}'|sed -e s/^/seq\ /g -e s/\$/\\\necho\ a/g|bash|tr '\n' ' '|sed s/\ //g|tr 'a' '\n'|sed -e s/./1/g -e s/\$/aaaaaaa/g|sed s/......./\&\\\n/g|sed /^a*\$/d|rev|sed s/aa/\ /g

 

1111111
  11111
    111
     1
   111
  11111
1111111

 

seq 1 7|tac|nl|awk '{if ($1 > $2) print $2,$1;else print $1,$2}'|sed -e s/^/seq\ /g -e s/\$/\\\necho\ a/g|bash|tr '\n' ' '|sed s/\ //g|tr 'a' '\n'|sed -e s/./1/g -e s/\$/aaaaaaa/g|sed s/......./\&\\\n/g|sed /^a*\$/d|rev|sed s/aa/\ /g|sed -e s/^1/2/g -e s/\ 1/\ 2/g -e s/1\$/2/g|tr '1' ' '

エックスジャパンができあがる

 

2020/02/14

echo a43b5a8b1a4b1a13b1a8b1a3b1a11b1a25|sed -e s/a/\\\n0\|head\ \-n\ /g -e s/b/\\\n1\|head\ \-n\ /g|sed /^\$/d|sed s/^/yes\ /g|bash|tee a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a && cat a|awk '{ORS=NR%14?"":"\n";print}'|sed s/0/\ \ /g|sed s/1/\[\]/g|textimg -asl9 -F100 -f /u*/s*/f*/t*/h*o/*A.ttf

 

lsでフルパスを出力する

持ってきたファイルのファイル名の先頭が-の連続から始まっていて処理に困ったときに使えた

$ ls $(pwd|sed s@\$@/\*@g)