このBlogは移転しました。今後は aish.dev を御覧ください。

tse 0.0.5リリース

久しぶりに tse をリリースした。遅ればせながら Python3で動くように修正し、いくつかオブションを追加した。

tse は sedawk のように Pythonコマンドラインから実行するためのツールで、詳しくは 以前書いた解説 を参照していただきたい。

今回のリリースでは、実行する Python スクリプトを、 {{}} を使ってインデントを記述できるようにしてみた。

tse -p '' -a 'if L1:{{for c in L2:{{print(c)}}else:{{print(L3)}}}}else:{{print(L4)}}'

のようなスクリプトは、

if L1:
    for c in L2:
        print(c)
    else:
        print(L3)
else:
    print(L4)

に変換される。tse のコマンドラインパーサは Pythonの構文を理解しており、文字列定数やコメント中に {{}} があっても無視するようになっている。

また、--inplace 引数に、ファイルの拡張子を指定すると、出力は標準出力ではなく、入力ファイルを上書きするようになった。元の入力ファイルは、--inplace 引数で指定した拡張子をつけたファイル名に保存される。

Python3対応もできたので、ずいぶん出番が増えてきた。最近では以下の様な使い方をしていた。

  • 全角・半角文字列を正規化

    {.sourceCode .sh} $ echo '123アイウエオ' | tse -ms unicodedata -s '.*' 'print(normalize("NFKC", L))'

  • スペース区切りのテキストからcsvに変換

    {.sourceCode .sh} $ tse -m csv -b 'o=csv.writer(sys.stdout)' -s '.*' 'o.writerow((L1,L2,L3))' < ~/C.txt

  • gitのユーザ名をコミット数順に表示

    {.sourceCode .sh} $ git log|tse -ms collections -b 'c=Counter()' -s '^Author: (.*)' 'c[S1] +=1' -e 'for a, n in c.items():print(n, a)'|sort -g

  • ファイルの文字コード変換

    {.sourceCode .sh} $ tse --inplace='.bak' -ie euc-jp -oe shiftjis -s '.*' 'print(L)' -- a.txt

  • 特定の文字列を含むプロセスを kill

    {.sourceCode .sh} $ ps -a|tse -s python 'print(L.split()[0])'|xargs sudo kill