C言語で言う"sscanf"をしたいのですが、シェルスクリプトではどう書くのでしょうか。
イメージとしては、ファイルの中に"hoge=100"と書かれている行があり、そこから100を取り出したいです。
#! /usr/bin/sh input_file=... hoge=`sed -n -e "/^hoge=/s/hoge=\([1-9][0-9]*\).*/\1/p" $input_file` echo "hoge は ${hoge}"
もっと複雑なことをしたいなら、シェルスクリプトの中で、perl を使って、
String::Scanf で処理することになる、かな。
http://search.cpan.org/~jhi/String-Scanf-2.1/lib/String/Scanf.pm
(1)
/^hoge=/s/hoge=
と
s/hoge=
では、どう違うのでしょうか?
アドレス指定の正規表現が軽い指定だと、ちょっと早くなるんじゃないかな、と思って、つい付けてしまいます。
ぼくの癖だと思ってください。
(2)
hoge=100の"="の前後にスペースがある場合はどのように書くのでしょうか?
以下のようになるかと思ったのですが、エラーにはならないものの正しく動きません。。。
sed -n -e "/^hoge.*=.*/s/hoge.*=.*\([1-9][0-9]*\).*/\1/p" $input_file
イコールの前後のスペースを表すなら、ピリオドでは無くて、スペースを使いましょう。
イコールの後のピリオドが数字にもマッチしてしまいます。
sed -n -e "/^hoge *= */s/hoge *= *\([1-9][0-9]*\).*/\1/p" $input_file
ちょっと、見づらいですね。
「.」 → 「 」 になってます。
回答に追記しましたっ!
2012/02/03 23:36:06ご丁寧にありがとうございます!
2012/02/04 00:03:26(2)のスクリプトで大満足しました。