人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


●質問者: Barogu
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
ベストアンサー
#! /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

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


Baroguさんのコメント
ありがとうございます! 2点質問があるのですが、 (1) /^hoge=/s/hoge= と s/hoge= では、どう違うのでしょうか? (2) hoge=100の"="の前後にスペースがある場合はどのように書くのでしょうか? 以下のようになるかと思ったのですが、エラーにはならないものの正しく動きません。。。 sed -n -e "/^hoge.*=.*/s/hoge.*=.*\([1-9][0-9]*\).*/\1/p" $input_file

a-kuma3さんのコメント
回答に追記しましたっ!

Baroguさんのコメント
ご丁寧にありがとうございます! (2)のスクリプトで大満足しました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ