• ベストアンサー

perl上でのgrepでエラーとなる文字の対応

perlプログラム内で、grepを行っております。 grep対象の中身に +、*、(、)、[、]などの文字列が含まれているため、エラーとなり、 プログラムがうまく動作しません。 grepしたい対象データ例:http://www.XXX.co.jp/○○+▲▲ http://www.XXX.co.jp/○○+▲▲の+を 文字として判断し、正規表現扱いではないとしたい。 http://www.XXX.co.jp/○○+▲▲を含む文字を抽出したい。 perl プログラムにおいて @line1 = grep(/$url/,<ARG>); という記述しておりますが、どのように変更すればよいでしょうか? また、grepしたい対象データがファイルに格納されておりますが、 その中で、+を \+ にファイル一括変換する場合、:%s/+/\+/g で やろうとしても、変換されません。 perlプログラムでの対応、grep元ファイルの変換処理方法 それぞれのやり方について教えてください。

  • Perl
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

quotemeta ないし等価な \Q~\E

1204533
質問者

お礼

さっそくのご教授ありがとうございます。 quotemeta関数というものを利用して、やってみたいと思います。 なお、「等価な \Q~\E」とは どういうものでしょうか?

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

有効な回答を求めるならば、実行環境(OS、デフォルトの文字コード、perlのバージョン、ファイルの文字コード、ファイルの読み取り方)などを記述しておいたほうがいいと思います。

1204533
質問者

お礼

あまり、プログラムについて詳しくないので、実行環境も意識して 今後 記載したいと思います。 ご指導 ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

\Q から \E の間は正規表現におけるメタキャラクタとしての扱いをしない. ここでも書いた記憶があるので, 可能なら調べてみるといい. 余談: 「grep元ファイルの変換」で「:%s/+/\+/g で やろうとしても、変換されません。」とか書いてるんだけど, 「いかなるプログラムで変換しようとしたのか」くらいはちゃんと書いてください. 「何とかして Perl で変換しようとした」と思われても文句は言えないよ. あと, なぜこれで変換できないのか理解してますか?

1204533
質問者

補足

\Q から \E の話 理解いたしました。 変換は vimで単純に行おうとしておりました。¥と正規表現扱いとしないで、置換したかったのですが、ファイル直接vimで開き、一括置換を 考えておりました。

関連するQ&A

  • perlでテキストから顔文字を抽出するプログラム

    テキストファイルから顔文字を抽出するプログラムを作りたいのですが、行き詰まっています。 一応、正規表現の内容としては、 半角と全角の括弧と前後の記号っぽいものを抽出し、 括弧の中身が「3文字以上半角英数字/全角文字列が続かないもの」という条件で、 抽出すれば上手くいくのかなぁと考えているのですが、上手くperlで表現できていない状態です。 どなたかプログラムに詳しい方で、ソースを記述できる方がいれば、よろしくお願いいたします。

  • grepの書き方がわかりません。

    Perlの初心者なんですが、以下のようなテーマをもらってプログラムを作っています。  第一引数にディレクトリのパス、第二引数に検索し たいファイル名を指定して第一引数の  パス以下にある全てのディレクトリを検索してファイルがあればそのパスを表示させなさい。 一応できたのですがプログラムの記述の一部がよくわかりません。以下のプログラムは一部です。 local ($dir, $file) = @_; opendir(DIR,$dir) or die @data = readdir(DIR);#ディレクトリの内容を読む closedir(DIR);#ディレクトリを閉じる local @fname = grep {-f "$dir/$_"} @data; local @dname = grep {-d "$dir/$_"} @data; $dir,$fileには第一、第二引数の文字列をいれているのですがそのディレクトリになかにファイル、ディレクトリがないか検索するためgrepを使っています。それで"$dir/$_"の部分の意味がよくわかりません。 この部分は他のサイトであったものを流用しただけなのですがよくわからないまま使ってたまたま動いたから使用しててこのままでは理解していないままなので どうか教えてほしいです。 あともう一点ありましてgrepのところで最初自分で書いた時  local @fname = grep (-f,@data); というように書きました。ファイルが第一引数にあるときは問題なく動作するのですがその下にあるディレクトリにあるとなぜかプログラムが終わりません。 デバッグとして@dataの中身を表示したらそのディレクトリの検索をしてはいるんですが、その中に目当てのファイルがあるはずなのに@dataの中身がからっぽで ファイルがないことになっています。この違いがどうしてもわかりません。  以上の二点がわからないんですがどうかお手数ですがどなたか教えてください。  

    • ベストアンサー
    • Perl
  • シェル関数引数のスペース文字列をgrepに

    下記のシェル関数 arg_space() 内で、grepを使いたいのですが。 'aaa bbb' などのスペースを含む文字列を引数として渡すとスペース後の文字列がファイル名と 認識されてしまいます。 -- arg_space.sh -- #!/bin/bash CHK_STR='aaa bbb' FILE_NAME='data/aaa.txt' function arg_space() { return `grep -c $1 $2` } arg_space $CHK_STR $FILE_NAME if [ $? -ge 1 ]; then echo 'Match !!' else echo 'No match.' fi exit 0 ------------------ ]# ./arg_space.sh grep: bbb: No such file or directory Match !! スペース文字を、grep に区切り文字として認識させないようにする 方法を教えて 頂けないでしょうか。 -- data/aaa.txt -- aaa bbb ccc ddd ---------------

  • CGIでのgrep関数においての質問

    Perl言語で作成するCGIプログラムについての質問なのですが、grep関数をつかって文字のマッチングを試みて、1回目はうまくいったのですが、同じように2回目を同じプログラムで使ったところ、絶対に0件マッチになります。検索対象も、検索文字列も、スカラー変数でだしてみて目で確認して明らかに合致しているのに0件になります。 ちなみに、使用した関数は以下のような感じです。 @hit = grep(/$data1/,@data2); $hit = grep(/$data1/,@data2); $hitでだしてみても0になりますし、@hitも何も入っていません。 grep関数は2回使えないのでしょうか。 検索文字はメールアドレスなのですが、前のプログラムで同じように関数を使って成功していますので、検索文字が原因ではないと思いますが。 ご回答お願い致します。

    • ベストアンサー
    • Perl
  • grepの方法について

    私は現在、500ファイル近いjspファイルもしくはhtmlファイルから hrefのリンクだけを抽出する作業を行っています。 下記コマンドでgrepをかけた場合、 後ろにつながる文字列まで抽出されてしまいます。 grep -i -e "href=" ソースファイルとしては、 <a href="ファイルパス.html" target><img src=""> というように、hrefの後ろにつながって 他のタグが記述されてしまっていますが、 hrefの"ファイルパス.html"のみを抽出したいのです。 どうすればよいでしょうか。 お手数かと思いますが、 宜しくお願いいたします。

  • grepの使い方

    "A.lst"と"B.lst"の2つのファイルがあります。 ともにディレクトリ階層の一覧が記述されています。 2つのファイルを比較して、A.lstのディレクトリ階層の文字列を 含む行を、B.lstから抽出して、リダイレクトで出力するには、 どういうコマンド操作になるのでしょうか。 特定の文字列ならば単純に、cat B.lst | grep moziretsu > sample.lst でいいわけですが、この文字列がA.lstファイル内に複数行あり、 それを順にgrepするにはどうすればいいのかがわかりません。 シェルもただいま勉強中です。 よろしくご教授願います。

  • Perlの正規表現で文字の抽出

    Perlを勉強しているのですが正規表現についてよくわからないので教えてください。 $text="【件名】本文" とあるときに、【】で囲まれた文字列(【】も含む)を抽出し、$textに戻したいのですがどうすればいいのでしょうか? ($textの中身を【件名】としたいのです) よろしくお願いします。

    • ベストアンサー
    • Perl
  • 改行を含んだgrep

    お世話になっております。質問です。 エディタでサクラを使っています。 改行を含んだgrepはできますか? また、以下のやりかたを見ていただいて、良いやり方がありましたらご教示下さい。 ABCを含んだ行を対象に、;(行の終わり)までを抽出したいのです。 現在以下のような条件でgrepしていますが、ABCを含む行全てが抽出されません。 ABC.*(\r\n)*.*; また、以下のようにgrepすると、ABCを含む行全てがgrepされますが、対象ファイル内で改行されていた場合、;まで抽出されず、改行場所までしか抽出されません。 ABC; 詳しい方、宜しくお願い致します。

  • perl 正規表現 抽出

    perl の正規表現を用いて、文字列の抽出を行いたいのですがどのように 書けばいいのかわかりません。 実現したいことは 「Y:/フォルダ名/フォルダ名/ファイル名.拡張子」 というテキストに対して 「拡張子」のみを抽出することと 「ファイル名」のみを抽出することです。 パターンマッチや変換はなんとなくわかるのですが 抽出の仕方がよくわかりません。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perlプログラム内で中間ファイルを利用するには

    perlプログラムについて 処理1 の アウトプットデータを用いて、処理2を行うというのを1つのperlのプログラム内で実装したいと考えています。 処理1のアウトプットファイルの書き出しに時間がかかり 処理2が先に動き、ファイル読み込みできずに終わってしまいます。 処理1のアウトプットファイル書き出しが終了を待ってから、処理2を実施したいのですが、 どのように記載すればよいのでしょうか? 例) perl program.pl AAA > BBB program.pl 内 open(OUT1,"> program1_work"); open(ARG,$ARGV[0]); while(<ARG>){ 処理1 print OUT1 "XXXXXX"; } close(ARG); open(ARG1,OUT1); while(<ARG1>){ 処理2 print "XXXXXX"; } close(ARG1);

専門家に質問してみよう