Linuxのシェルスクリプトについて質問です。

C言語で言う"sscanf"をしたいのですが、シェルスクリプトではどう書くのでしょうか。
イメージとしては、ファイルの中に"hoge=100"と書かれている行があり、そこから100を取り出したいです。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/02/04 00:03:38

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

#! /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

ちょっと、見づらいですね。
「.」 → 「 」 になってます。

他1件のコメントを見る
id:a-kuma3

回答に追記しましたっ!

2012/02/03 23:36:06
id:Barogu

ご丁寧にありがとうございます!
(2)のスクリプトで大満足しました。

2012/02/04 00:03:26

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません