- 締切済み
expectを用いた正規表現[]のgrepについて
題名のとおり、expectを用いた正規表現のgrepをしたいのですが、 以下のように記述し、入力し、実行すると expect -c " spawn ssh ~~~ expect \"password:\" send \"hogehoge\n\" expect \">\" send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\" expect \">\" send \"exit\n\" " 以下のようにエラーが出てしまいます。 invalid command name "1-9" while executing "1-9" invoked from within [0-9]この部分を\[0-9\]このようにエスケープしてみても同じエラーが出てしまい、実行できません。 どのようにすれば正規表現として認識してくれるのでしょうか。 以上よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
> "探したいもの" → \\\"探したいもの\\\" > 上記の部分に関しましては、 > 最初にzgrepの部分でエスケープしているためか、エスケープせずとも問題ないようです。 ちょっと思い違いをしているようですが まず、この expect -c " の"以降を解釈するのは、これを実行するシェルです。 このままだと > send \"zgrep " の後の"が、-c "の"に対応するクオートです文字列です。 「探したいもの」はクオート無しです。 \でエスケープした"は、他の文字と同じになり、それ自体にクオートする機能はありません。 「"send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\""」 は、例えば 「"send Qzgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\nQ"」 と書いたのと、文法的な解釈は同じなのです。 > send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\" は、 クオートを展開した文字列「 ... send "zgrep 」 直に書かれた文字列「探したいもの」 クオートを展開した文字列「 /なんかのログ.log.gz | grep -v 」 直に書かれた文字列「[0-9]%」 クオートを展開した文字列「\n" ... send "exit\n"」 となります。 直に書かれた文字列では、 ・空白があったら、単語の区切りとなって、別の引数になる ・特殊な文字はファイル名展開対象とかで使われてしまう ということになります。 この例では「探したいもの」と空白無しですが、実際はここに空白が入ったりしてませんか? そして、そこで-cの引数としては切れてしまったりしていませんか? あと、 \nじゃなくて\\nだと思います。 expect -c を echo にして、表示されるのが、期待通りのexpectスクリプトになっているかも確認してみてください。 こういうのは、 ・変数展開とか必要が無いところはシングルクオートを使う ・ヒアドキュメントを使う ・別のファイルにする のが間違いが少ないです。
- entree
- ベストアンサー率55% (405/735)
ダブルクォーテーションを二重にエスケープしないといけないのでは? "探したいもの" → \\\"探したいもの\\\" "[0-9]%" → \\\"[0-9]%\\\"
補足
回答ありがとうございます。 "探したいもの" → \\\"探したいもの\\\" 上記の部分に関しましては、 最初にzgrepの部分でエスケープしているためか、エスケープせずとも問題ないようです。 また、[0-9]の部分に関しましては二重でエスケープしてみましたが、同じエラーとなってしまいました。 send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\" 以上よろしくお願いいたします。