min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash sedでラベリングによりループ回して三角形を書く

シェル芸勉強会の動画。毎度すごい参考になる。

f:id:min117:20200119212013j:plain

www.youtube.com

 

シェルにこんな三角形を表示するワンライナーはどう書くか?

f:id:min117:20200119203000p:plain

 

こうやる。

$ echo ' ^^' | sed ':a p;s/ ^/^ /;b a' | head -n 5 | sed 1i.

f:id:min117:20200119203355p:plain

すごい。

 

$ echo ' ^^' | sed ':a p;s/ ^/^ /;b a' | head -n 5 | sed 1i.

:a aというラベリングをするよ。あとでaとして使うよ

p プリント(画面に表示)せよ

s/ ^/^ / 半角スペース^ を ^半角スペースにせよ

b 直後にきたラベル文字(今回はa)に分岐せよ(:aで指示した処理をせよ)

 

つまり、a p;s/ ^/^ /; で示した処理をb でループしてる。

 

これすごい。ワンライナーで、しかもsedの中でループしてるってことか。日々のbashでしょっちゅう使えそう。

 

sedのマニュアルも見ておく。

$ man sed

f:id:min117:20200119204129p:plain

 

sed 1i.はオマケ。1行目にドットを表示(して見栄えをよく)せよ、というだけ。

 

表示する文字を/と\に変えて

sedの区切り文字を/から@に変えてみると

 

変更前 echo ' ^^' | sed ':a p;s/ ^/^ /;b a' | head -n 5 | sed 1i.

変更後 echo ' /\' | sed ':a p;s@ /@/ @;b a' | head -n 5 | sed 1i.

f:id:min117:20200119205316p:plain

すごすぎ。

 

[fedora PT3]$ echo 'lCAgL1wKlCAvlCBcCiAvlCAglFwKLyAglCAglFwK77+j77+j77+j77+jCg=='|base64 --decode | sed '3s//👁/3;1s/^././'

  /\

 / \

 /  \

/    \

 ̄ ̄ ̄ ̄

 

f:id:min117:20200119211626p:plain