- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlで特定行から特定行までを抜き出しor置換)
perlで特定行から特定行までを抜き出しor置換
このQ&Aのポイント
- perlを使用して、特定行から特定行までの範囲のテキストを抜き出す方法や、特定行から特定行までの範囲で文字列を置換する方法を知りたいです。
- 具体的には、テキストファイルから「#START」から「#END」までの行だけを抜き出したいです。また、その範囲内で「test」という文字列を別の文字列で置換したいです。
- sedコマンドでは、以下のように実行することができます。`sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt`このような操作をperlで行う方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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 のようにします。
その他の回答 (1)
- kumoz
- ベストアンサー率64% (120/185)
回答No.2
1. 'if ($r = /#START/ .. /#END/) スカラーコンテキストでの範囲演算子の戻り値として、範囲外では偽、範囲内では 1 からの範囲行番号、範囲の終了行では番号の末尾に 'E0' が付加されたものが、返されます。 2. if $r > 1 and $r !~ /E0/; 戻り値を利用すると、行番号を付けたり、開始行や終了行での特別な処理をすることができます。上記では、開始行と終了行を除外しています。
質問者
お礼
解説ありがとうございます。 今後、よく似たことをする際に参考にさせていただきます。 ありがとうございます。
補足
ありがとうございます。 以下の方法で教えて頂きたい部分があります。 > 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/; の部分ですが、 どのような処理、動きなのでしょうか。