perlで特定行から特定行までを抜き出しor置換

このQ&Aのポイント
  • perlを使用して、特定行から特定行までの範囲のテキストを抜き出す方法や、特定行から特定行までの範囲で文字列を置換する方法を知りたいです。
  • 具体的には、テキストファイルから「#START」から「#END」までの行だけを抜き出したいです。また、その範囲内で「test」という文字列を別の文字列で置換したいです。
  • sedコマンドでは、以下のように実行することができます。`sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt`このような操作を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
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

Perl では範囲演算子を使うことができます。 > sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt と同じにするには、 perl -pe 's/test/newtext/g if /#START/ .. /#END/;' test.txt なお、aaaa から script までを出力するには、 perl -ne 'if ($r = /#START/ .. /#END/) { s/test/newtext/g; print if $r > 1 and $r !~ /E0/; }' test.txt のようにします。

abc999xyz
質問者

補足

ありがとうございます。 以下の方法で教えて頂きたい部分があります。 > perl -ne 'if ($r = /#START/ .. /#END/) { s/test/newtext/g; print if $r > 1 and $r !~ /E0/; }' test.txt 1. 'if ($r = /#START/ .. /#END/) 2. if $r > 1 and $r !~ /E0/; の部分ですが、 どのような処理、動きなのでしょうか。

その他の回答 (1)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

1. 'if ($r = /#START/ .. /#END/) スカラーコンテキストでの範囲演算子の戻り値として、範囲外では偽、範囲内では 1 からの範囲行番号、範囲の終了行では番号の末尾に 'E0' が付加されたものが、返されます。 2. if $r > 1 and $r !~ /E0/; 戻り値を利用すると、行番号を付けたり、開始行や終了行での特別な処理をすることができます。上記では、開始行と終了行を除外しています。

abc999xyz
質問者

お礼

解説ありがとうございます。 今後、よく似たことをする際に参考にさせていただきます。 ありがとうございます。

関連するQ&A

  • Perlで特定行から特定行までを抜き出したい

    皆さんのお知恵をお貸し頂ければ幸いです。 Perlで以下のようなことをしたいと考えています。 例えば、次のようなテキストファイルがあったとします。 example.log ================================== aaaa hogehoge test okok perl script ================================== 上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。 イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。 このような場合、どういう風にすればいいのでしょうか? 恐れ入りますが、ご教授頂ければ幸いです。 それでは、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • perlでファイル内を検索

    perlでファイル内を検索して読み込みを行いたいのですが どのようにすればよいでしょうか。 環境は、Solaris10 以下のようなファイル(test.txt)から  #start1~#endの間にある、”01:”で始まっている値をすべて取得する。  複数行になっている場合、カンマで1つにする。  ”01”ではじまっていないものは無視する。#などで始まっているものも。 ●ファイル:test.txt #start1 01:abc,aaa,bbb 01:1234 #01;a1,b1,c1 02:(省略) 03:(省略) #end #start2 01:(省略) 02:(省略) 03:(省略) #end #start4 01:(省略) 02:(省略) 03:(省略) #end ●結果 abc,aaa,bbb,1234 として読み込みたい。

  • sedスクリプト 置換

    この度、はじめてsedスクリプトをかいてみようと思っています。 以下の機能を持った置換スクリプトを書きたいのですが、 アドバイスなど頂ければ幸いです。 ・abcディレクトリ内を検索して(サブディレクトリも含む)、test.txtというファイルを探し出す(test.txtは複数あります) ・検索された複数のtext.txtを一括で置換する ↓置換内容 ・test.txtの5行目にある文字列を1からはじまる連番に置換する(test.txtは複数あるので、処理した順に連番をつけていく) イメージが伝わりにくい場合は、どうかご指摘ください。 よろしくお願いします

  • ファイル中の数行を抜き出す処理について(シェル)

    ファイルaaa.txtの2行目から4行目を抜き出し、 ファイルbbb.txtに格納する方法として、 sed -n '2,4p' aaa.txt > bbb.txt がありますが、 変数を使用し、 start=2 end=4 sed -n '${start},${end}p' aaa.txt > bbb.txt とすると、エラーが発生します。 どうすればよろしいのでしょうか。

  • sedで特定文字が出たら次の行は読み飛ばす

    Linuxのsedコマンドなのですが、特定文字列が出たら読み飛ばすという事をやっています。 例えば、'#SKIP'が出たら次の行(複数行)は読み飛ばすみたいな事をです。 行飛ばしで2点質問がありますのでお願いします。 以下の様なファイルがあります。 /---------- $ cat input.txt YYYY YYYY YYYY YYYY YYYY #SKIP YYYY YYYY YYYY YYYY YYYY -----------/ '#SKIP'が出たら次の行を読み飛ばすは、 $ sed '/#SKIP/{N; s/YYYY/2016/g}' input.txt YYYY YYYY YYYY YYYY YYYY #SKIP 2016 YYYY YYYY YYYY YYYY と、'#SKIP'の下の行が置換されます。 数行読み飛ばす場合は $ sed '/#SKIP/{N;N;N; s/YYYY/2016/g}' input.txt YYYY YYYY YYYY YYYY YYYY #SKIP 2016 2016 2016 YYYY YYYY と、'#SKIP'から下の3行が置換されます。 てっきり、'#SKIP'から指定した(N;)行分読み飛ばし、それ以降を置換すると 思っていたのですが違うのでしょうか。 使い方が間違っているのでしょうか。 また、同じ様な行飛ばしで、範囲指定した場合ですが、 $ sed -e '3,20n;n;n; s/YYYY/2016/g' input.txt や $ sed -e '3,20{n;n;n; s/YYYY/2016/g}' input.txt とした場合、範囲指定外の3~20以外でも置換されます。 3行目から置換されたり、20行目を越えても置換されます。 OS、バージョンによるものでしょか。 本記載の2点について教えて下さい。

  • sedの置換文字に変数を使用したいのですが・・・

    あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。 例: X="a" Y="b" echo test.txt | sed 's/${X}/${Y/g}' >test.txt sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • awkでファイルから特定の行を抽出する方法

    初心者です。 ファイル(a.txt) 2005.12.05 2.5,1.0,a01 5.0,2.0,9.5 2005.12.06 6.5,4.0,3.2 b1,3.0,7.5 2005.12.07 ・ ・ というようなファイルから2、5、8・・・行目を 抜き出しファイル(b.txt)に「awk」又は「perl」で出力する方法を教えて下さい。

  • 参照ファイルを用いて、複数のテキスト置換を一括で行

    参照ファイル(list.txt)を用いて、一括でファイルの中身(test.txt)を置換したいです。以下のようにワンライナーで書いたのですが、以下のようなエラーが出ました。 使っているのはMac Os10.15.5です。 何か問題があるのでしょうか? 間違っている点があれば教えていただきたいです。 sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' list.list | xargs -I{} sed -i '{}' test.txt sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o <list.txt> AAA aaa 111 222 abc efg ....

  • ディレクトリ内の複数ファイルの中から特定の文字列を置換したい

    ディレクトリ内の複数ファイルの中から特定の文字列を置換したい 要は、あるフォルダ内のテキストファイルに含まれる 123を987にしたいということなんですが。 sedは使えなかったんで、 perl -p -i -e 's/123/987/' *.txt としたらできました。 しかし、 perl -p -i -e 's/$rh, $rh1/$rh2, $rh2/' *.cgi のようにスペースを含むとどうもうまくいきません。 教えてください。お願いします。

専門家に質問してみよう