• ベストアンサー

特定文字列で囲まれた範囲を抜き書きするためには?

特定の文字列で開始され、特定の文字列で終了するテキストの一部を抜き出すためには、コマンドラインからは perl -ne 'print if /開始文字列/ .. /終了文字列/' file.txt でできると思うのですが、これがたとえば $page 変数に入ったテキストで同様の処理を Perl 内部のスクリプトで行う時にはどうすればいいのでしょうか? while(<$page>){ ... } とかやって1行1行処理してみようと思ったのだけど、できません。

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

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

  • ベストアンサー
  • 2NN
  • ベストアンサー率40% (143/353)
回答No.2

#1の補足です。 変数に入れる場合は、 my ($str) = $page =~ /(開始文字列.+終了文字列)/s; とします。 複数取り出す場合は、 my @array = $page =~ /(開始文字列.+終了文字列)/gs; で配列として取り出すことができます。

chitosefu
質問者

お礼

完璧です。 大変助かりました。ありがとうございます。

その他の回答 (1)

  • 2NN
  • ベストアンサー率40% (143/353)
回答No.1

print $page =~ /(開始文字列.+終了文字列)/s; これでどうでしょうか。

関連するQ&A

  • ファイル中の特定文字列を繰り返す処理

    文字列操作についてご教示いただけますでしょうか。 特定文字列(FFF)を基準にして、次のFFFが現れるまでの行にFFFの行にある文字列を先頭に挿入したいと考えています。 エクセルだと簡単にできるのですが、行数が多いためperlで処理をしようと考えています。 以下のようなテキストを FFF あああ text1 text2 text3 ... FFF えええ text6 text7 text8 ... 以下のようにしたいと考えています。 FFF あああ あああ text1 あああ text2 あああ text3 あああ ... FFF えええ えええ text6 えええ text7 えええ text8 えええ ... どのような処理にするとよいでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perlで特定行から特定行までを抜き出しor置換

    perlで以下のようなことをしたいと考えています。 以下のことを、コマンドラインから「perl ~」という形で 実行したいのですが、どのよにすればよいでしょうか。 1.特定行から特定行までを抜き出し 2.特定行から特定行の範囲で文字列置換 例えば、次のようなテキストファイルがあったとします。 example.txt ================================== #START aaaa hogehoge test okok perl script #END ================================== 上記ファイルを読み込んで、 1.「#START」から「#END」の間に挟まれた行だけ抜き出し 2.「#START」から「#END」の間で、「test」を置換 のです。 sedで言うところの sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt をやりたいのです。

    • ベストアンサー
    • Perl
  • シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入

    こんにちは。 シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入したいと思います。 ・sample.txt (挿入前) -- <ABC> <ABC> Hello! </ABC> </ABC> -- ↓ ・sample.txt (挿入後) -- <ABC> <ABC> Hello! </ABC> Good Morning Good Evening </ABC> -- 上記のように、テキスト末尾から検索して、 はじめて表れた"</ABC>"のタグの前に、 Good Morning Good Evening という2行の文字列(無理なら1行でも)を追加したいと考えています。 "</ABC>"タグは2つありますが、末尾から検索して初めて表れたもののみ対象です。 このような操作を行うには、 どのようにシェルを組み合わせれば良いのでしょうか? grepやsedを用いて考えてはいますが、よく分かりません。 (grepで末尾から初めて表れた"</ABC>"の行番号を取得し、 その上に、sedで文字列を挿入するなどですが・・・よく分かりません) どなたか、よろしくお願いします。

  • 文字列から特定の文字を抜き出す

    こんにちは。 シェルスクリプトで文字列から特定の文字を抜き出し、 変数に入れたいのですが、うまくいきません。 申し訳ありませんが、アドバイスをお願いいたします。 文字列 $moji=aaa_bbb_ccc (文字は変動します) $a=aaa $b=bbb $c=ccc と"_"毎に変数に代入したい。 echo $moji | awk -F_ '{print $2}' で文字を標準出力に取り出すことはできるのですが、 そこから変数に代入する方法がいまいち分かりません。

  • 【継続質問】シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入

    シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入 の継続質問です。よろしくお願いします。 tacとawkを用いて、"ある特定の文字列の前に文字列を挿入"ということができるのは、 確認することができました。 例えば、  script.awk (awkスクリプト)  sample.txt (処理対象ファイル) という環境で、  $ cat script.awk  $ tac sample.txt | awk -f script.awk | tac > sample2.txt とコマンドを入力した場合、 sample2.txtに、処理が完了したテキストが作成され、 中身も問題ないことを確認できました。 しかし以下のようなことを実現しようと思うと、 うまく行きませんでした・ 「非対話的に上記の処理を行いたいのです」 上記の方法では、 catとtacと2回コマンドを叩く必要があります (1回にもできるのでしょうが…) できれば、自動的に流れる膨大なシェルスクリプトの処理の中で、 上記の処理を自動的に行うということを実現したいのです。 例えば、auto.shというシェルを実行すれば、 勝手にawkスクリプトを読み込み、勝手に変換したものを出力してくれる… そのようなシェルを作成したいと考えています。 そこで色々試しましたが上手くいきません。 1.コマンドの分解ができない tac sample.txt | awk -f script.awk | tac > sample2.txt の上記を、  #!/bin/sh  tac sample.txt  awk -f script.awk  tac > sample2.txt のようにシェルスクリプトに記述しなおして実行しましたが、 上手くいきませんでした。 2.script.awk(awkスクリプト)を内部に取り込み 外部ファイルとして存在している、script.awkをなんとか シェルに組み込もうと思って、  awk {(script.awkの内容をそのまま記述)} のように行いましたが、文法的にやはり無茶苦茶でした・・・。 正直、2番が無理であれば仕方ありませんが、 最低でも1は実現したいと思います。 1の方法だけでも良いので、どなたか回答をお願いします。

  • bashスクリプトでの文字列から特定文字列の位置特定

    bashスクリプトで 文字列から特定の文字の位置を取得する場合 expr index 文字列 特定したい文字 のように書きますが、aaa_atestという文字列から "atest"という文字列の開始位置を取得する ことはできません 何か方法はないのでしょうか

  • 置換した文字列を変数に代入する方法

    お世話になります。 たとえば、 #!C:\Perl\bin\perl print $form->header("text/html");  : open(IN,"<file.txt"); while(<IN>){ : : s/あい(.*?)うえお/$1/; (????)←「$1」の内容を変数に代入したい : : } close(IN); というように、テキストファイルの文章中の 「あい(.*?)うえお」から(.*?)を取り出して、 その取り出した(.*?)を変数に代入したいのですが、 いろいろ試してやっているのですが、難儀して おります。どのように書いたらいいか教えてください。よろしくお願いします。 最終的にclose(IN);のあとで、print 変数;として(.*?)の文字列を表示させたいです。

    • ベストアンサー
    • Perl
  • 特定の文字列が一致する行から、文字列を抽出する方法

    ファイルから、特定の文字列を検索し、その文字列に対応する文字列を取得したいのですが、どなたか方法を教えていただけないでしょうか? 処理: test.txt中に以下の文字列が記載されています。 ----- TEST011:FILE00 TEST01:FILE01 TEST02:FILE02 XTEST01:FILE01 XTEST02:FILE02 ----- test.txtから、TEST01に対応する文字列FILE01を取得したいです。 当初、strchrを利用すれば良いかと考えていたのですが、 TEST011の行が先に抽出されてしまい、うまくいきません。 どなたか解決方法を教えていただけないでしょうか。

  • 範囲演算子と文字列マッチングを組み合わせたときの解除方法

    Windows-XP上でActivePerl/5.8.8を利用しています。 テキストファイルなどで、ある文字列が現れた行から、ある文字列が現れるまで、 ということを判定させるときに、範囲演算子が使えるということを知りました。 while(<>){     chomp;     if(/^START$/ .. /^END$/){ # 範囲指定         ・・・         STARTの行から、ENDの行までこのブロックに入る     } } 1ファイルに対してだけ処理させるときは上手く行くのですが、 連続して複数のファイルを処理させようとすると、 2番目のファイルからは、開始条件(/^START$/)が既に成立したと 判断されてしまうようで、該当行が現れていないのに、ifブロックに 入ってしまいます。 foreach(@ARGV){ # 複数ファイルに対して処理させる     open(FH,$_) || die;     while(<FH>){        chomp;        if(/^START$/ .. /^END$/){ # 範囲指定            ・・・            1つ目のファイルではSTARTの行から、ENDの行まででこのブロックに入るが、            2つ目のファイルではSTARTの行が現れないうちからこのブロックに入ってしまう。        }     } close(FH); } これを2つ目のファイル以降も、範囲指定の開始条件が成立していない 状態から処理させるためには、どのようにすれば良いでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 文字列の比較

    現在Cでプログラムをつくっているのですが いきずまってしまいました。 1.テキストファイルを読み込む 2.書き込みファイルを開く 3.読み込んだデータを一行読み込んで   その行の特定の文字列があれば、   特定の文字列のみ取り出し、   書き込みファイルに書く。    4.次以降の行も同じ処理をする。    5.読み込み、書き込みファイルを閉じる。 と、こんな感じのプログラムなのですが、 3の特定の文字列をどのように取り出せばいいのかわかりません。 取り出したいのが数字ならば、if文でできるのですが 文字列の場合は、どうなんでしょうか。 例えば、「MOJIRETU11」という取り出したいとき 数字と同じようにIF文を使用することは、できるのでしょうか。