次のようないくつかの XML タグを含むファイルがあります。
<Good>Yay!</Good>
<Great>Yup!</Great>
<Bad>booo</Bad>
<Bad>
<Ok>not that great</ok>
</Bad>
<Good>Wheee!</Good>
「悪い」タグとその間のものを取り除きたい場所。したがって、次のようになります。
<Good>Yay!</Good>
<Great>Yup!</Great>
<Good>Wheee!</Good>
私はこのワンライナーを知っています:
perl -pe "undef $/;s/<Bad>.*?<\/Bad>//msg" < originalFile > newlyStrippedFile
私がやりたいことはすべてやっているようです(余分な改行を入れることを除いて、うまくいけば、それを十分に簡単に処理できます)
しかし、それをスクリプトに入れる必要があります (2 つのファイルがコマンド ラインに読み込まれ、1 つはすべてのタグを含み、もう 1 つは抽出するタグのリストを含みます)、同じことが何度か呼び出されることになります。
そして、私はちょうど問題を抱えています。1行しか読み取っていないか、エラーが発生するか、またはその両方です。
私の最近の試みの関連部分は次のとおりです。
open ORIGINAL_FILE, $sdb_pathname
or die "Can't open '$sdb_pathname' : $!";
@sdb_input_array = <ORIGINAL_FILE>;
close ORIGINAL_FILE;
@sdb_input_scalar=join("",@sdb_input_array);
foreach $tag (@tags) {
&remove_tag($tag);
}
sub remove_tag
{
my($current_tag) = @_;
$sdb_input_scalar =~ s/<$current_tag>.*?<\/$current_tag>//msg;
open NEWLY_STRIPPED_FILE, $clean_sdb_pathname
or die "Can't open '$clean_sdb_pathname' : $!";
print(NEWLY_STRIPPED_FILE $sdb_input_scalar);
close(NEWLY_STRIPPED_FILE);
}
これにより、「私の $sdb_input_scalar =~ 行で、初期化されていない値 $sdb_input_scalar を置換 (s///) で使用することができます。また、ファイルハンドル NEWLY_STRIPPED_FILE が入力用にのみ開かれます」
もちろん、私の 2 つのファイルは、何もしていないかのように、同じように見えます。
明らかな何かが欠けている場合は申し訳ありませんが、私は文字通り perl の初心者です。職場の誰かがこのスクリプトを実行するのに 8 時間かかると見積もっていましたが、私は perl のインストール、構文の学習、およびその他の側面を正しく行うためだけに、すでに 5 時間以上を費やしました。XML::Parser モジュールがあることは知っていますが、完了するまでに残された短い時間のために、例が非常に圧倒されていることがわかりました。
ワンライナーがうまく機能するため、正規表現が正しいと想定する必要があります。誰かが私が必要とするものに適応させるのを手伝ってくれませんか?