de[v|b]log

ShellScript, Coffee, iOS/OSX Dev
Origin: Himajinworks.
About.

今日も引き続き.zshrc内の関連ファイルのnative-zshスクリプト化の作業。

進捗

1
2
3
4
5
6
7
8
9
10
* 2ca5a57 (HEAD -> master, origin/master, origin/HEAD) [DEL] Removed unnecessary debugging line
* 40b2f78 [MOD] Switched ssh-tool to native-zsh script
* dcfa09d [COSM] Split functions in ssh helper
* bcd6d7a [COSM] Clean up varibale declaration
* dbdc3cf [COSM] Clean up block style
* 40e1a46 [COSM] Clean up variable expansion
* 3ea8b44 [MOD] Switched to native-zsh script
* 2aa26b6 [MOD] Split functions
* 573b1fe [MOD] Switched variable expansion style to safe
* 20fb88e [COSM] Cosmetics of code style

得た知識

実は昨日の作業ほど得られた知識はなかった。(ほぼ同じ内容だったため)

grepに関連した作業をどう実現するか

以下は今日出した答えである。 今回は入力として、Key :Valueという構造を取るファイルを考えた。

行いたいことはcat filename | grep key | cut -d: -f2である。

上記で利用している正規表現はその構造に準じており、入力したkey値に対するvalueを取得するものである。 尚、今回はkey値がユニークであるファイルを対象としたため処理途中でreturnを行っている。

1
2
3
4
5
6
7
8
9
10
11
12
13
local lines line
local key=${1}
local input_file="filename"

lines=(${(@f)"$(cat ${input_file})"})
for line in ${lines}; do
    [[ "${line}" =~ '^'${key}'[[:space:]]+:(.*)$' ]] && {
        [[ -n "${match[1]}" ]] && {
            echo ${match[1]}
            return 0
        }
    }
; done

まずlines=(${(@f)"$(cat ${input_file})"})だが、これは昨日の記事で取り扱ったのと同じで、単純にファイルの各業を要素とする配列を生成するものである。 それに続くforループは単純にマッチする要素を線形探索するものである。 このようにすることで、Key :valueという構造のファイルに対するgrepと、このコードの場合tr(もしくはsed)の適用ができたことになる。

TODOとして、上記を利用し簡単なgrepを作ることがあげられる。

難しい点

これまで grepsed等の、改行を含むファイルに対してそのまま使えるコマンドを使ってきたため、行単位で手動でマッチをかけないといけないのが難しいし書き方が無駄に煩雑になっている点が難しい。

備考

現時点で1/3程度のnative-zshスクリプト化が終了したので、引き続き行う。