1. ホーム
  2. perl

[解決済み] Perlによる多行検索置換

2023-07-13 17:08:52

質問

この種の質問はすでに何度もされていることだと思います。なぜまたここに来たかというと、何か単純で基本的なことを見落としているような気がするからです。

この種の検索-置換ルーチンをより良くすることは可能でしょうか。たとえば、同じファイルを 2 回開かなくて済むようにするなどです。また、速度関連のアドバイスも歓迎します。

これは複数行のマッチや複数行の文字列の置換でも動作することに注意してください。

#!/bin/perl -w -0777

local $/ = undef;

open INFILE, $full_file_path or die "Could not open file. $!";
$string =  <INFILE>;
close INFILE;

$string =~ s/START.*STOP/$replace_string/sm;

open OUTFILE, ">", $full_file_path or die "Could not open file. $!";
print OUTFILE ($string);
close OUTFILE;

どのように解決するのですか?

このような検索と置換は、以下のようなワンライナーで実現できます。

perl -i -pe 's/START.*STOP/replace_string/g' file_to_change

同じことを実現する他の方法として、次のものをチェックしてください。 スレッド . 複数行の検索を扱うには、次のコマンドを使用します。

perl -i -pe 'BEGIN{undef $/;} s/START.*STOP/replace_string/smg' file_to_change

以下のコードをワンライナーから perl プログラムに変換するために perlrun ドキュメント .

もし、これを実際に動作するプログラムに変換する必要性を感じたら、Perlにファイルのオープンとクローズを処理させればよいのです。

#!/usr/bin/perl -pi
#multi-line in place substitute - subs.pl
use strict;
use warnings;

BEGIN {undef $/;}

s/START.*STOP/replace_string/smg;

次に、ファイル名を第一引数としてスクリプトを呼び出すことができます。

$perl subs.pl file_to_change

もし、もっと本格的なスクリプトでファイルのオープン/クローズ操作を行いたいのであれば、perlrun の -i[extension] スイッチ付きの例を見てみてください。