【问题标题】:Perl search and replace substringPerl 搜索和替换子字符串
【发布时间】:2015-10-03 03:04:19
【问题描述】:

如何使用 perl 脚本搜索和替换子字符串?

例如 --> txt1.txt

Hi/hello #55
Hi/hi #55

如何在 txt1.txt 中搜索 variable1,如果找到将其替换为 variable2。 主题标签后可以有 0-100 之间的任何数字。我想搜索 首先是“Hi/hello”,如果找到,将整个内容“Hi/hello #(0-100)”替换为“Hi/hello #60;

mytry.txt

my $variable1="Hi/hello #(0-100)";
my $variable2="Hi/hello #60;
print "$short\n";
system(q{perl -pe"s|($ENV{variable1} *)#\d+|$ENV{variable2}|;" txt1.p4sm  > txt2.p4sm});

desiredoutput.txt

Hi/hello #60
Hi/hi #55

【问题讨论】:

  • 你试图在那里运行的东西看起来很奇怪。
  • 确实,这很奇怪...关于字符串替换 - 如果您提供替换前后的示例数据,然后详细解释替换的内容和原因,那就太好了。此时Hi/Hello 可以被人们解释为实际的字符串,或者应该接受Hihello...
  • 为混淆道歉,我已经更新了我原来的问题..

标签: regex string perl search replace


【解决方案1】:

您所做的没有多大意义,如果您已经在 Perl 脚本中,请不要执行 Perl 单行程序,只需编写一个简单的循环来解决您的问题。

最简单的方法是创建一个匹配您想要的模式,然后逐行执行替换。下面的示例使用DATA 文件句柄,但可以将其替换为指向您要修改的源文件的文件句柄:

use strict; 
use warnings; 

my $pattern = qr|(Hi/hello) #\((\d{1,3})\)|;
while ( my $row = <DATA> ) {
   # enforce restriction for 0-100
   if ( $row =~ m/$pattern/ && $2 >= 0 && $2 <= 100 ) {
      # replace with new suffix
      print $row =~ s/$pattern/$1 #(60)/gr;  
      next;
   }

   print $row;
}

__DATA__
Hi/hello #(1)
Hi/hello #(10)
Hi/hello #(100)
Hi/hello #(101)

输出:

Hi/hello #(60)
Hi/hello #(60)
Hi/hello #(60)
Hi/hello #(101) <- ignored because it doesnt fall into range [0, 100]

正则表达式解释:

(Hi/hello) #\((\d{1,3})\)

这个正则表达式匹配并捕获两条数据,前缀“Hi/hello”和#(&lt;number&gt;)中的数字。这些分别存储在$1$2 中。

【讨论】:

  • 猎人,感谢您的快速回复。几个问题...我可以使用将其更改为我的 $pattern = qr|($variable1) #((\d{1,3}))|; 吗?而且我在“print $row =~ s/$pattern/$1 #(60)/gr;”行附近的操作员预期的位置找到了 Bareword并且还可以将其更改为 variable2 而不是 $pattern/$1 #(60)/gr... 因为它不会一直是 60 我只想用 variable2 替换它...
  • @Mihir 然后将替换部分更改为$variable2
【解决方案2】:

根据您的描述,您要查找的内容如下:

my $variable1="Hi/hello #(0-100)";
my $variable2="Hi/hello #60";
if($variable1 =~ /Hi\/hello/)
  {
    $variable1 =~ s/^.*$/$variable2/;
  }

我期待的不止于此,但让我们从这里开始吧。

【讨论】:

  • 你错过了第二行的结尾"
猜你喜欢
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多