第28回シェル芸勉強会に大阪サテライト会場から参加しました。

第28回シェル芸勉強会に大阪サテライト会場から参加しました。

【問題のみ】第28回基準値を超えるシェル芸勉強会 – 上田ブログ

自分の解答を記載します。
今回はTeXの整形がお題でやったことがあるものも多くあったので比較的楽でした。(Q7解けてませんが。。。)

Q1

Q1.1

contents.txtについて、「\begin{figure}と\end{figure}」で囲まれた部分を全て抽出してください。

A1.1

sed "<pattern1>,<pattern2>!d"で一発でできます。
sedの行指定で"<pattern1>,<pattern2>"をしたときは最長一致だと思っていましたが、やってみたら最短一致だった。入れ子になっていたりする場合はawkで数える必要があると思います。

Q1.2

次のようなリストを作ってください。

世界座標系とロボットの姿勢 ./figs/coordinate.eps
計測値 ./figs/observation.eps
ランドマークの計測値から2点の相対姿勢を求める ./figs/two_poses.eps
ランドマークの計測値の不確かさを表す共分散行列 ./figs/observation_noise.eps

A1.2

埋め込んである図(eps)のパス名とキャプションのペアを出力する問題です。
\includegraphicsの次の行にキャプションの行があったのでgrep -A 1で引っ張ってくることができました。


Q2

\sectionから始まる部分を章としたとき、第2章の第1文を抽出してみましょう。ただし、各行の%以降はコメントアウトされた文なので無視してください。

A2

一般解を作りました。正規表現{}を使って第n章を指定しています。


Q3

脚注(\footnote{…})の部分を全て抽出してください。一つだけ、脚注の中にも{}で囲まれた部分があるので注意してください。

A3

一般解(& Vimシェル芸)にこだわりすぎたため、勉強会中には解けませんでした。

LT開始までの休憩時間にVimシェル芸で解きました。
括弧が入れ子になっているのが簡単にできない理由で、括弧の対応関係を見つけるといえばvim%なのでそれを使いました。


Q4

各章(\sectionから次の\sectionまでの部分)を、ファイル名にタイトルをつけて個別のファイルに分けてください。ファイル名のスペースはアンダースコアに変えても構いません。

A4

これまでのシェル芸勉強会で学んだことで、awkスクリプトの中でのリダイレクトがあるので、それを使いました。
#標準的なawkの使い方に感じる(だいぶ毒されてる)。

Q5

このテキストには「○○座標系」という用語がいくつか出てきます。○○にはカタカナか漢字の単語が入ります。これらの「○○座標系」を全通り抽出してください。

A5

なぜかマルチバイト文字が指定できませんでしたが、PCRE(Perl互換正規表現)を使うオプション-Pを付けると動きました。


Q6

各段落の頭に全角スペースを入れてください。

A6

「前の行が空行だったらスペースを入れる」ということを考えて、行をまたがるときはawkを使うと楽なのでそうしました。


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で一発でやっているので、複雑な割りにシェル芸っぽくないです。

上のツイートは収まるように削ったコマンドなので可読性が低い。
削っていないバージョンは次のもので、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/}.*//'