第3回シェル芸爆破デスマッチ勉強会&第21回餃子爆破定例会に参加して来ましたので
その時の自分の中のまとめを書き留めておきます。
ちなみに餃子定例の方は予定があったため不参加orz
やったこととか
概要的な
基本的には会長さんから10題のお題をシェル芸で解決していくという流れ。今回はawk控えめで非常にとっつきやすかったです。
当日のスライドはこちら↓
20130216 シェル芸爆破デスマッチ勉強会
また、USP友の会のHPにもこの勉強会のエントリーがあります。
第3回シェル芸爆破デスマッチ勉強会&第21回餃子爆破定例会やってきた
自分で出した答え
その場でTweetしたのは引用、Tweetしそこねた・後で考えた・修正したのは普通に記載で。- 問1 最初考えた奴
cat tel | sed 's/\([0-9]\{3\}\)\([0-9]\{4\}\)\([0-9]\{4\}\)/\1-\2-\3/g'でもコレ"\"だらけでわかりづらいよ!!(実際会場だと\忘れでちゃんと動く奴を出せなかった。。。)
- 要は
cat tel | perl -pe 's/(\d{3})(\d{4})(\d{4})/$1-$2-$3/g'的なのやりたかっただけなんだけどね。。 ちなみにsed使った会長さんの回答のほうが簡単でした。
- 問2 1問目を元に考えたのがコレ
基本に沿っていけばこうなるよな。。 cat tel2 | sed 's/-//g' | sed 's/電話番号://' | sed 's/\+81/0/g' | sed 's/^…/&-/g' | sed 's/……$/-&/g' #usptomo — Kei Iwasakiさん (@laugh_K) 2013年2月16日
cat tel2 | sed 's/-//g' | sed 's/電話番号://' | sed 's/\+81/0/g' | sed 's/^.../&-/g' | sed 's/....$/-&/g'とはいえ冷静に考えれば
cat tel2 | sed 's/-//g' | sed 's/[^0-9]+://' | sed 's/\+81/0/g' | sed 's/^.../&-/g' | sed 's/....$/-&/g'でよかったね。
- 問3
cat hoge | perl -nle 'for($i=0;$i<100;$i++){ print }'こうですか?わかりません #usptomo — Kei Iwasakiさん (@laugh_K) 2013年2月16日
cat hoge | perl -nle 'for($i=0;$i<100;$i++){ print }'sed使ってやったほうが行数増えるごとにパフォーマンス上がるらしいです。
- 問4
ハッシュタグ忘れてた… 普通に sed 's/[,、,]/、/g' でおkな感じ #usptomo — Kei Iwasakiさん (@laugh_K) 2013年2月16日
cat sakubun | sed 's/[,、,]/、/g'ここはsedのyコマンドを使うという手もあるようです。
- 問5
cat dadan | perl -pe 's/[^\\]_/$1 /g' | perl -pe 's/\\_/_/g'tweetしそこねてたけど、こんな感じで考えました。
- #usptomoを見ると同様に考えた方もいらっしゃったようです。
- 問6
これでよいかな? cat aiueo | tr -d '\n' | sed 's/./&\n/g' | wc -l#usptomo — Kei Iwasakiさん (@laugh_K) 2013年2月16日
cat aiueo | tr -d '\n' | sed 's/./&\n/g' | wc -lイメージとして、
- 一旦すべての改行を取っ払ってから、
一文字一文字の間に改行をぶち込んで、
- 結果の行数数えればいんじゃね?的な感じでした。
- sedのみの回答を見たときは思わず拍手が上がりました。(震え声)
- 問7
こんな感じ。 find . -name "*.sh" -exec sed -i.bak 's;^#!/bin/bash;#!/usr/local/bin/bash;g' {} \; #usptomo — Kei Iwasakiさん (@laugh_K) 2013年2月16日
find . -name "*.sh" -exec sed -i.bak 's;^#!/bin/bash;#!/usr/local/bin/bash;g' {} \;まあ確実にファイル探し当てて実行するとなるとこちらのほうが良いかなと思ってfind使ってみたり。
- 問8 実は詰まってしまって、9問目解いた余った時間でやっと解けた感じ。
今更問8解いた。やっぱtr使わないと厳しいなー cat hoge.html | tr -d '\t' | perl -pe 's;</?(table|tr)>;;g' | perl -pe 's;</?td>\n?;;g' | sed '/^$/d' #usptomo — Kei Iwasakiさん (@laugh_K) 2013年2月16日
cat hoge.html | tr -d '\t' | perl -pe 's;</?(table|tr)>;;g' | perl -pe 's;</?td>\n?;;g' | sed '/^$/d'ここまで来るとこれまでの問題が結構参考になりました。
- 途中までtrなしで行けないかなーと思いましたが、結局使ってしまいました。
- このへんはもう少し改良してみたいかも
- 問9
9問目はこれかな for i in $(alias | sed 's/^alias //g' | cut -d"=" -f1 ) ; do unalias $i ; done #usptomo — Kei Iwasakiさん (@laugh_K) 2013年2月16日
for i in $(alias | sed 's/^alias //g' | cut -d"=" -f1 ) ; do unalias $i ; done会場はドハマリな雰囲気でしたが、意外なことに僕はあっさりできてしまいました。。
- unaliasが組み込み系のコマンドのため、
- | xarg とか | while read とかやってしまうと挙動が変わってしまってなかなかいう事を効かないみたいです。
- 問10と問11 タイムアップorz
- ここは時間があるときに自力でも考えてみようと思います。できたら更新するかも。
参加した感想など
今回はawk控えめで問題の難易度が程よく、良い感じにShell芸を学べた感じです。前回と違って怖い感じよりは
笑いあり、新たな発見ありの非常に楽しく濃い3時間でした。
次回までにはawk芸かperl芸をもう少し鍛えておきたいです。
4月にやるみたいな話がちらっと出ていたので、その際も参加しようと思います。
過去分は体調悪かったり予定が入ってたりで懇親会行けなかったですが、次こそは最後まで参加したいです!