在Perl中搜索并替换特定单词

时间:2013-06-04 02:30:57

标签: perl

我有一个巨大的文件,下面有类似的行,有不同的时钟:

cmd -quiet [get_ports p1] ref_clocks "cudtclk_sp cudtclk"

cmd -quiet [get_ports p2] clock "cu2xdtclk_sp cu2xdtclk"

每当我在我的文件中全局使用ref_clocks时,我需要用cdtclk等其他名称替换cudtclk。

我写过以下代码,但似乎没有用。

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

sub clock_change 
{       # Get the subroutine's argument.
   my $arg = shift;
   # Hash of stuff we want to replace.
   my %replace = ( 
      "cudtclk" => "cdtclk",
   );

   # See if there's a replacement for the given text.
   my $text = $replace{$arg};

   if(defined($text)) {
      return $text;
   } 

   return $arg;
}

open PAR, "<file name>";
while(<PAR>) {
   $_ =~ s/\S+\s\S+\s\S+\s\S+\sref_clocks\s+(\S+\s+\S+)/clock_change($1)/eig;
   print $_;   ##print it to some file later.
}

2 个答案:

答案 0 :(得分:3)

“我需要用其他名称替换cudtclk,比如cdtclk”

perl -pe 's/\bcudtclk\b/cdtclk/' thefile > newfile

“每当我有ref_clocks”

perl -pe 's/\bcudtclk\b/cdtclk/ if /\bref_clocks\b/' thefile > newfile

可替换地:

# saves original file as file.bak
perl -i.bak -pe 's/\bcudtclk\b/cdtclk/ if /\bref_clocks\b/' file

根据需要收紧以适合您的数据。

答案 1 :(得分:0)

尽管替换似乎不必要地复杂,但您可以使用类似于以下内容的方法进行修复:

$_ =~ s/(ref_clocks\s+")([^_]+)_sp(\s+)\2/
     $1.clock_change($2)."_sp$3".clock_change($2)/eig;
相关问题