我有一个巨大的文件,下面有类似的行,有不同的时钟:
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.
}
答案 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;