de[v|b]log

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

やったこと

まずは手始めに .zshrc と、個人で書いてるライブラリ群の名前の若い方から zsh-script に移行を進めていた。

1
2
3
4
5
6
7
* 21cea79 (HEAD -> master, origin/master, origin/HEAD) [MOD] Switched ccat command to native zsh script
* 885b75e [COSM] Cosmetics and switched archive command to native-zsh-script
* 88ec139 [COSM] Update syntax in window manager configuration files
* a9213b8 [MOD] Stop prism
* 7da25c7 [MOD] Change ignore command split task into native-zsh script
* ab1e11c [MOD] Switched to pgrep
* 3f04a03 [MOD] Clean up unnecessary comments
  • sedtr等のいつも使ってるコマンド群を使わないようにしないといけないため若干手間取った。
  • ps -A | grep "something" | egrep -v 'grep something'"pgrepに移行した。

Tips

1
("${(@f)$(cat -n ${file})}")

とすることで、ファイルやコマンドから出力した各行を要素とした配列を生成できるのが便利。これでまず置換処理の対象を単純化できた。

参考 :

次に戸惑ったのが、 sed だと sed 's!\(regexp\)!-> \1!' とすることでパターンマッチの結果を得られたのだが、これをどう実現するかというところであった。

1
[[ ${str} =~ ' (regexp) ' ]] && echo ${match[1]}

こうである。こうすることでグルーピングされた部分(上記の(regexp))が${match}にグループ順で収められる。 またここで上記で言う(regexp)部にスペースを含めたかったがうまく扱えなかった。調べたところ、[[:space:]]クラスを使えとのことであった。

このふたつを用いることで、以下を実現した。

入力

1
line='1  awesome string'

sedの場合

1
echo ${line} | sed 's!^\([ ]\*\)\([0-9]\*\)[ ]\*\(.\*\)$!\1\\e[33;1m\2\\e[0m\3/g'

zshの場合

1
[[ ${line} =~ '^([[:space:]]\*[0-9]+)[[:space:]]\*' ]] && echo -ne "\\e[33;1m"${match[1]}"\\e[0m${line//${match[1]}/}"

若干長くはなってしまったが、こうすることで同じことを実現することができる。ただしこのコードではマッチしたものを削除する書き方をしているためもう少し賢い書き方があるであろうと思う。

尚、上記のコードの目的はcat -nとして、catで行番号を付けて出力したものの行番号に色を付けることである。

参考 :