小编Evi*_*ady的帖子

如何将这个perl one-liner转换成脚本(特别是多行,全局正则表达式替换)

我有一个包含多个XML标签的文件,如下所示:

<Good>Yay!</Good>
<Great>Yup!</Great>
<Bad>booo</Bad>
<Bad>
<Ok>not that great</ok>
</Bad>
<Good>Wheee!</Good>
Run Code Online (Sandbox Code Playgroud)

我想摆脱"坏"标签和其他任何东西.所以它会变成:

<Good>Yay!</Good>
<Great>Yup!</Great>
<Good>Wheee!</Good>
Run Code Online (Sandbox Code Playgroud)

我知道这个单行:

perl -pe "undef $/;s/<Bad>.*?<\/Bad>//msg" < originalFile > newlyStrippedFile
Run Code Online (Sandbox Code Playgroud)

似乎做我想做的一切(除了添加额外的换行符,但希望我能够轻松地处理它)

但是我需要把它放在一个脚本中(两个文件被读入命令行,一个带有所有标签,另一个带有要拔出的标签列表),所以同样的事情会被多次调用.

而我只是遇到了麻烦.要么它只读一行,要么我得错误或两者兼而有之.

以下是我最近尝试的相关部分:

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);  

}
Run Code Online (Sandbox Code Playgroud)

这让我"在我的$ sdb_input_scalar =〜行中使用未初始化的值$ sdb_input_scalar替换(s ///).并且仅为输入打开Filehandle NEWLY_STRIPPED_FILE

当然,我的两个文件看起来仍然相同,好像我没有对他们做任何事情. …

regex perl replace

2
推荐指数
1
解决办法
295
查看次数

标签 统计

perl ×1

regex ×1

replace ×1