在perl脚本中查找和替换文本

时间:2014-05-24 06:35:32

标签: perl

所以我知道有很多方法可以做我要求的事情,但我发现的所有方法并没有帮助我做我想做的事情。 它应该是使用stdin和stdout的简单查找和替换脚本。 我有一个名为replace.pl的脚本,这就是我所拥有的:

#!/usr/bin/perl
use strict;
use warnings;

while(<STDIN>){
  $_ = s/$ARGV[0]/$ARGV[1]/g;
  print STDOUT $_;
}

当我运行echo "replace a with b please" | replace.pl 'a' 'b'时 我得到的只是一个“1”。我的愿望输出是“用b替换b”但是我试图做什么,它没有改变它。谁能告诉我这里我做错了什么?

2 个答案:

答案 0 :(得分:3)

尝试

s/$ARGV[0]/$ARGV[1]/g;

而不是

$_ = s/$ARGV[0]/$ARGV[1]/g;

当替换成功时s///返回1。

如果它应该是文字字符串(不是正则表达式),您也可以引用搜索模式,

  s/\Q$ARGV[0]\E/$ARGV[1]/g;

答案 1 :(得分:1)

来自perlop

  
      
  • <强> S / PATTERN / REPLACEMENT / msixpodualgcer

         

    在字符串中搜索模式,如果找到,则用替换文本替换该模式,返回替换次数。否则返回false(特别是空字符串)。

  •   

这就是代码设置$_ = 1的原因。您只需要s/$ARGV[0]/$ARGV[1]/g;替换副作用,而不将其返回值分配给$_

while (<STDIN>) {
    s/$ARGV[0]/$ARGV[1]/g;
    print;
}