omuronの備忘録

個人的な備忘録

シェル芸勉強会ちょっと見

シェル芸勉強会をやっていることをたまたま気がついたので未登録でしたが見てました。

usptomo.doorkeeper.jp

シェル芸は、基本 GNU コマンドで行うため、macOSBSD 系だと回答をみてもそのまま動かすことができません。 macOS で試す場合は、 brew で基本的なコマンドと、シェル芸でよく使われる awk sed を入れる必要がありました。

brew install coreutils
brew install gawk
brew install gnu-sed

Q1

echo コマンド にて、中括弧でくくった数字をドットでつなぐと連続された数字に展開されるようです。

$ echo {3..10}
3 4 5 6 7 8 9 10

まず、この基本的なことすら知りませんでした。 これを知っていれば、あとは -.. に展開して、

$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/-/../'
1, 3..5, 8, 10, 13-18, 20

- ハイフンの前の数字を正規表現 [0-9]+ で抜き出して

$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-/../'
1, ..5, 8, 10, 13-18, 20

- ハイフンの後ろの数字も正規表現 [0-9]+ で抜き出して、2箇所置換しているので g をつけて

$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/../g'
1, .., 8, 10, .., 20

中括弧をつけるようにして

$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/{..}/g'
1, {..}, 8, 10, {..}, 20

置換もとの数字も表示できるようにして

 echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/{\1..\2}/g'
1, {3..5}, 8, 10, {13..18}, 20

準備ができたので、頭に echo コマンドつけて

$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/{\1..\2}/g' | gsed -r 's/^/echo /' 
echo 1, {3..5}, 8, 10, {13..18}, 20

bash にわたすと出来上がり。

$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/{\1..\2}/g' | gsed -r 's/^/echo /' | bash
1, 3, 4, 5, 8, 10, 13, 14, 15, 16, 17, 18, 20

こういったことを丁寧に解説してくれるのでとても勉強になりました。 sedawk を使ってても雰囲気で使ってることを思い知らされた。 awk コマンドは簡単なことしか知らないので、オプションや使い方を学ぶことができそうです。 正規表現はある程度知ってることが前提なので、そこは別途勉強が入りそう。

「先週に引き続き土曜の昼から勉強会見ているのはいかがなものか」と家族に怒られてしまったので途中で離脱... YouTube Live はアーカイブされてます。 後半の Unicode は生で見たかったな。

www.youtube.com