2012年12月18日火曜日

exprで文字列評価

exprコマンドは算術演算専用かと思ってたら、実は文字列も少し扱えるということを知った。以下、使用例を添えながら機能を列挙。

expr length STRING

見たまんま、文字列STRINGの長さを標準出力に返す

% expr length foo
3

expr substr STRING POS LENGTH

文字列STRINGのPOS文字目からLENGTH文字切り出した部分文字列を、標準出力に返す。POSは文字列の先頭を1とする。LENGTHは長すぎてもエラーにはならず、STRING末尾までの部分文字列を切り出すが、POSは1以上かつ文字列長以下でなければexpr自体がエラー終了する。

% expr substr foobar 2 4
ooba
% expr substr foobarbaz 5 100
arbaz
% expr substr 'bad POS' 10 3
expr: syntax error
zsh: exit 2

expr index STRING CHARS

文字列STRINGの中から文字列CHARSに含まれる文字を先頭から探し、最初に見つかった位置を標準出力に返す。見つからなかった場合は標準出力に0を返した上で、expr自体がエラー終了する。

% expr index foobar abc
4
% expr index foobarbaz 12345
0
zsh: exit 1

expr match STRING REGEXP または expr STRING : REGEXP

文字列STRINGの中から正規表現REGEXPに一致する部分文字列の長さを標準出力に返す。一致する部分がなかった場合、標準出力に0を返した上で、expr自体がエラー終了する。ただし、REGEXP中に\(, \)で括られた部分がある場合は、一致した部分文字列の長さではなく\(, \)で括られた部分にマッチした文字列を標準出力に返す。

ただし、REGEXPは必ずSTRINGの先頭からマッチしないとならない。要は、REGEXPの先頭には暗黙の^が付加される。この癖を許容できる範囲なら、echoしてからgrepやsedするよりはちょっとエコw

% expr match abc123 '[A-Za-z]\+'
3
% expr 1920x1080px : '[0-9]\+x\([0-9]\+\)'
1080
% expr foo123bar : '[0-9]'
0
zsh: exit 1

マルチバイト文字対応

% echo $LANG
ja_JP.UTF-8
% expr length 'あいうえお'
15
% expr index 'あいうえお' 'うくすつぬ'
1

こんな状況なので、まじめにマルチバイト文字に対応したかったら、大人しく高級なツールを使おう。

0 件のコメント:

コメントを投稿