第28回シェル芸勉強会に大阪サテライト会場から参加しました。
【問題のみ】第28回基準値を超えるシェル芸勉強会 – 上田ブログ
自分の解答を記載します。
今回はTeXの整形がお題でやったことがあるものも多くあったので比較的楽でした。(Q7解けてませんが。。。)
Q1
Q1.1
contents.txtについて、「\begin{figure}と\end{figure}」で囲まれた部分を全て抽出してください。
A1.1
sed "<pattern1>,<pattern2>!d"
で一発でできます。
sed
の行指定で"<pattern1>,<pattern2>"
をしたときは最長一致だと思っていましたが、やってみたら最短一致だった。入れ子になっていたりする場合はawk
で数える必要があると思います。
\begin{figure}などは要らなかったらしい
— のぎろ (@nogiro_iota) 2017年4月22日
Q1.1 cat contents.tex | sed '/\\begin{figure}/,/\\end{figure}/!d' |grep -v -E '\\((begin)|(end))\{figure\}'#シェル芸
Q1.2
次のようなリストを作ってください。
世界座標系とロボットの姿勢 ./figs/coordinate.eps 計測値 ./figs/observation.eps ランドマークの計測値から2点の相対姿勢を求める ./figs/two_poses.eps ランドマークの計測値の不確かさを表す共分散行列 ./figs/observation_noise.eps
Q2
\sectionから始まる部分を章としたとき、第2章の第1文を抽出してみましょう。ただし、各行の%以降はコメントアウトされた文なので無視してください。
Q3
脚注(\footnote{…})の部分を全て抽出してください。一つだけ、脚注の中にも{}で囲まれた部分があるので注意してください。
Q4
各章(\sectionから次の\sectionまでの部分)を、ファイル名にタイトルをつけて個別のファイルに分けてください。ファイル名のスペースはアンダースコアに変えても構いません。
A4
これまでのシェル芸勉強会で学んだことで、awk
スクリプトの中でのリダイレクトがあるので、それを使いました。
#標準的なawk
の使い方に感じる(だいぶ毒されてる)。
Q4
— のぎろ (@nogiro_iota) 2017年4月22日
cat contents.tex | awk '/\\section/{title=$0;sub("[^{]*{","",title);sub("}","",title)}{print > title}'#シェル芸
Q5
このテキストには「○○座標系」という用語がいくつか出てきます。○○にはカタカナか漢字の単語が入ります。これらの「○○座標系」を全通り抽出してください。
Q6
各段落の頭に全角スペースを入れてください。
A6
「前の行が空行だったらスペースを入れる」ということを考えて、行をまたがるときはawk
を使うと楽なのでそうしました。
Q6 こっちのがいいか
— のぎろ (@nogiro_iota) 2017年4月22日
cat contents.tex | awk 'p==""&&!/^\\/&&!/^%/&&!/^$/{$0=" "$0;f=0}{print;p=$0}'#シェル芸
Q7
本文のところだけ改行を取ってください。
A7
解けていない。
Q8
contents.texについて、次のように章節項のリストを作ってください。
1 はじめに 2 問題 2.1 ロボットの姿勢と座標系 2.2 観測 2.2.1 ランドマークの識別 2.2.2 ランドマークの姿勢計測 2.2.3 計測値の記録 2.2.4 計測値の誤差 2.3 完全SLAM問題 3 graph-based SLAMの実装例 3.1 グラフのエッジを作る 3.1.1 $\V{\mu}_{c,t,t'}, \V{e}_{c,t,t'}$の計算 3.1.2 $\Sigma_{c,t,t'}, \Omega_{c,t,t'}$の計算 3.2 最適化問題を作る 3.2.1 マハラノビス距離 3.2.2 最適化する式 3.3 $\V{e}_{c,t,t'}$の勾配を求める 3.4 問題を解く
A8
awk
で一発でやっているので、複雑な割りにシェル芸っぽくないです。
cat contents.tex|awk -F\{ '/^\\sec/{j=0;k=0;print ++i, $2}/^\\subse/{print i"."++j, $2}/^\\subsu/{print i"."j"."++k,$2}'|sed 's/}.*//' #シェル芸
— のぎろ (@nogiro_iota) 2017年4月22日
上のツイートは収まるように削ったコマンドなので可読性が低い。
削っていないバージョンは次のもので、awk
の-F
オプションがキレイに使えてると思う。
[https://twitter.com/nogiro_iota/status/855674104229240832:embed]
記事を書いている時に気づきましたが、タイトル中にブレースが含まれていると正しく動かないですね。。。
$1=""
を入れて$0
を出力すれば動作すると思いますが未検証です。
cat contents.tex | awk -F\{ '{$1=""}/^\\section/{j=0; k=0; print ++i, $0} /^\\subsection/{print i"."++j, $0} /^\\subsubsection/{print i"."j"."++k,$0}'|sed 's/}.*//'