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

コマンドラインでPHPを使っています。
$path[$i] にはファイルのパスが入ります。
$handle = popen(“grep -c ‘<a[ ¥t¥n][^>]*href’ $path[$i]”, “r”);
と書くと「指定されたファイルが見つかりません。」と出るのですが、試しに
$handle = popen(“ls $path[$i]”, “r”); とするとエラーは出ません。
また、cygwin で直接「grep -c ...」と打つと、意図したとおり実行されます。
どうしたら「指定されたファイルが見つかりません。」と出ることなく、意図したとおりに実行されるでしょうか。

引用符と¥は、そのまま書けないようでしたので、質問文では全角にしました。

●質問者: hkn
●カテゴリ:コンピュータ
✍キーワード:cygwin grep href Ls PHP
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● hive7134
●18ポイント

http://www.google.com/

Google

違ったらごめんなさい。

¥のかわりに¥¥とすべきなのでは?

◎質問者からの返答

そうなんですか。URL で根拠を示してくださるとありがたいんですが。調べてみますね。

cygwin で直接「grep ...」と打つと大丈夫なので、大丈夫だと思っていたんですけど。

ちなみに、¥¥としても「指定されたファイルが見つかりません。」と出ました。

引き続き、回答を募集します。

追加情報ですが、ls の代わりに cat にすると、止まっているように見えました。

単に popen 関数の使い方を間違えているのか心配です。

PHP のバージョンは 4.3.10 です。Windows XP で cygwin を使っています。


2 ● Paul
●18ポイント

http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Manpage of GREP

grep -c だとファイル数しか出力されないので、-l だと思うのですが・・・

◎質問者からの返答

そうなんですか? マッチ数を表示させたいのですが。

URLを見ると、以下のように書いてありますけど。

-c 通常の出力はせず、各入力ファイルについてマッチした行数を表示します。

-l 通常の出力はせず、このオプションを指定しなかったときに出力される入力ファイルの名前を表示します。スキャン動作は最初のマッチで終了します。

そもそもこの質問文で突っ込むべきところはそこじゃない気がします。


3 ● hive7134
●17ポイント

http://www.google.co.jp/

Google

回答になりませんが、

echo “grep -c ‘<a[ ¥t¥n][^>]*href’ $path[$i]”;

して出力された文字列を

直接Cygwin上で打ちむ文字列と比較してみると解決の糸口がつかめるかもしれません。^^;

http://www.kauda.jp/~suguru/comp/php/strings.html#double_quot

PHP???????????????

ところで

“grep -c ‘<a[ ¥t¥n][^>]*href’ $path[$i]”

の変わりに

“grep -c ‘<a[ ¥¥t¥¥n][^>]*href’ {$path[$i]}”

とした場合はどうなりますでしょうか?

何らかの原因で$path[$i]がうまく展開されずバラバラになっていないかな?と思い、{}で囲んだのですが。

http://wisdom.sakura.ne.jp/programming/php/php6.html

文字列

ちなみに¥¥としたのは、二重引用符「”」内部では¥はエスケープする必要があるからです。

◎質問者からの返答

¥¥の件ですが、納得しました。ありがとうございます。

$path[$i] は {} で囲んでも変わりませんでした。

$path[$i] の代わりに、$path[$i]に入るパスを代入した普通の変数を使っても、同じ状態です。


4 ● Paul
●17ポイント

http://phpspot.net/php/man/php/function.popen.html

popen

何度もすいません・・・

ただ単にマッチ数を表示させたいのであれば

popenじゃなくて

execかsystemだと思うのですが・・・

http://fol.axisz.jp/php/man/php/function.exec.html

exec

popenの場合なんかの数字をのファイルを

オープンしようとしてしまうので、

「指定されたファイルが見つかりません。」

と出てしまうと思います

◎質問者からの返答

あー、そうなんですか。なるほど。ありがとうございます。

$num = exec(“grep -c ‘<a[ ¥¥t¥¥n][^>]*href’ $path[$i]”); という感じでしょうか?

試してみましたが、相変わらず「指定されたファイルが見つかりません。」と出ます。

でも grep の検索条件から「<」を抜くと、期待した結果が出ました。

正規表現の書き方に問題があるんでしょうか。試しに「¥<」と書いてもエラーが出るのですが。

----------

追記:

PHP ですが、Win32 用のバイナリを使っていたからだったみたいです。

Cygwin でコンパイルしてみたら、大丈夫でした。

お友達が教えてくれました。お騒がせしました。

関連質問


●質問をもっと探す●



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