0

ハードコードされた値をプレースホルダー タグに置き換えて編集したい複数のプロパティ ファイルを含むディレクトリが Linux ホスト上にあります。私の目標は、ハードコードされた値、プレースホルダー値、および編集するファイルの名前をリストする各プロパティ ファイルのエントリを含む区切りファイルを読み取る perl スクリプトを作成することでした。

たとえば、file.prop では、これらの値を設定しています

            <connection targetHostUrl="99.99.99.99"
                        targetHostPort="9999"

そして、以下に示すように値をタグに置き換えたい

            <connection targetHostUrl="TARGETHOST"
                        targetHostPort="PORT"

これに似たエントリがいくつかあるため、IP と PORT の一意の組み合わせで照合する必要があるため、複数行の照合が必要です。

これを行うために、|| で区切られた区切りファイル名の入力を取得する次のスクリプトを作成しました。config ディレクトリからそのファイルを取得し、値を読み込んで、編集するハードコードされた値、タグ、およびファイル名を取得します。次に、そのプロパティ ファイルを読み込み、置換を行ってから、再度書き出します。

#!/usr/bin/perl
my $config = $ARGV[0];
chomp $config;
my $filename = '/config/' . $config;
my ($hard,$tagg,$prop);
open(DATAFILE, $filename) or die "Could not open DATAFILE $filename.";
while(<DATAFILE>)
{
  chomp $_;
  ($hard,$tagg,$prop) = split('\|\|', $_);
$*=1;
open(INPUT,"</properties/$prop") or die "Could not open INPUT $prop.";
@input_array=<INPUT>;
close(INPUT);
$input_scalar=join("",@input_array);
$input_scalar =~ s/$hard/$tagg/;
open(OUTPUT,">/properties/$prop") or die "Could not open OUTPUT $prop.";
print(OUTPUT $input_scalar);
close(OUTPUT);
}
close DATAFILE;

構成ファイル内には、次のエントリがあります

<connection targetHostUrl="99.99.999.99"(.|\n)*?targetHostPort="9999"||<connection targetHostUrl="TARGETHOST1"\n targetHostPort="PORT"||file.prop

私の出力は以下のとおりです。それは私が望んでいた改行をリテラルとして置きます\n

<connection targetHostUrl="TARGETHOST"\n targetHostPort="PORT"

\n を改行として取得する方法が見つかりません。最初は、問題ないと思いました。次のように2番目の置換を行うだけです

perl -i -pe 's/\\n/\n/o' $prop

これは機能しますが、何らかの理由で、置換を行った行を除くすべての行の末尾に ^M 文字が配置されます。それらを取り除くために3回目の交換をしたくありません。

複数行の検索/置換を行う他の方法を検索して見つけましたが、それらはすべて \n を文字通りに解釈します。

助言がありますか?

4

1 に答える 1

0

私の出力は以下のとおりです。それは私が望んでいた改行をリテラルとして置きます\n

文字列に改行が含まれていないのに、なぜ改行が挿入されるのでしょうか?

\n を改行として取得する方法が見つかりません。

ありません。改行を置き換えたい場合は、改行を提供する必要があります。

Text::CSV_XS のような適切な CSV パーサーを使用した場合、データ ファイルに改行を入れることができます。

それ以外の場合は、コードで処理するエスケープ シーケンスを処理するコードを記述する必要があります。

何らかの理由で、置換を行った行を除くすべての行の末尾に ^M 文字が配置されます。

まったく逆です。置換を行った 1 行から削除します。

いくつかのプログラムは、キャリッジ リターンを表します。CR LF 行末を持つファイルがあります。を使用dos2unixして変換することも、XML は気にしないのでそのままにしておくこともできます。

于 2013-02-21T23:08:07.043 に答える