Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック第3章2節練習問題その1

練習3.2.a 行またぎの検索と置換

行をまたいで置換と検索を行う問題だった。

墾田墾田永年私財

墾田永年
forever私財法
墾田永年

財法
墾田永年永吉
私財法
財法
墾田永年私

というファイルから私財法をおれのものに置き換えたり、墾田永年私財法という文字列を行をまたいで抜き出したりした。

オプションの -z をつければ行をまたいだ検索をやってくれると書いてあったのでそのまま素直に私財法と sed で書いたところ何も処理が行われず、ちょっと混乱したがよくよく考えてみると改行文字もきちんと sed で指定しないとだめだと気が付いた。

墾田永年私財法を抜き出す問題では素直に書くだけだったが、別解のやり方のほうがスマートな感じがする。

cat konden | grep -ozP $(sed 's/./&\\n?/g' <<< 墾田永年私財法)

というワンライナーで s/./&\\n?/g と書くことで sed で一文字ずつ選んではその文字の後ろに \n? という文字を挿入している。& はパターンでマッチした文字列全体を表している。\\n? と書くことで \n の \ をエスケープして \n という文字列が入るようにしている。? は0または1回の繰り返しを表す正規表現である。

 

練習3.2.b ひらがなとカタカナの変換

nkf というコマンドの使い方を練習する問題だった。特に書くことがない。