2013/02/18

第3回シェル芸爆破デスマッチ勉強会に参加してきたよー!


ちょっと出遅れましたが、
第3回シェル芸爆破デスマッチ勉強会&第21回餃子爆破定例会に参加して来ましたので
その時の自分の中のまとめを書き留めておきます。

ちなみに餃子定例の方は予定があったため不参加orz

実は第1回目にも顔を出していたけどおじけづいてブログ書かなかったのは内緒だ


やったこととか
概要的な
基本的には会長さんから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'
     
    
    とはいえ冷静に考えれば
     
    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 }'
     
    sed使ってやったほうが行数増えるごとにパフォーマンス上がるらしいです。
     
  • 問4
  •  
    cat sakubun | sed 's/[,、,]/、/g'
     
    ここはsedのyコマンドを使うという手もあるようです。 
     
  • 問5
  • http://www.youtube.com/watch?v=wRvcsUqHAWY
     
    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
     
    イメージとして、
    一旦すべての改行を取っ払ってから、 一文字一文字の間に改行をぶち込んで、
    結果の行数数えればいんじゃね?的な感じでした。
    sedのみの回答を見たときは思わず拍手が上がりました。(震え声) 
     
  • 問7
  •  
    find . -name "*.sh" -exec sed -i.bak 's;^#!/bin/bash;#!/usr/local/bin/bash;g' {} \;
     
    まあ確実にファイル探し当てて実行するとなるとこちらのほうが良いかなと思ってfind使ってみたり。 
     
  • 問8
  • 実は詰まってしまって、9問目解いた余った時間でやっと解けた感じ。
     
    cat hoge.html | tr -d '\t' | perl -pe 's;</?(table|tr)>;;g' | perl -pe 's;</?td>\n?;;g' | sed '/^$/d'
     
    ここまで来るとこれまでの問題が結構参考になりました。
    途中までtrなしで行けないかなーと思いましたが、結局使ってしまいました。
    このへんはもう少し改良してみたいかも 
     
  • 問9
  •  
    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月にやるみたいな話がちらっと出ていたので、その際も参加しようと思います。
過去分は体調悪かったり予定が入ってたりで懇親会行けなかったですが、次こそは最後まで参加したいです!