Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 使用perl搜索并替换文件中的部分文本_File_Perl_Replace - Fatal编程技术网

File 使用perl搜索并替换文件中的部分文本

File 使用perl搜索并替换文件中的部分文本,file,perl,replace,File,Perl,Replace,我编写了一个perl脚本,用其他文本替换文件中的文本,保留搜索文本的某些部分。 但是,我的脚本没有按预期工作,我在Stackoverflow中看到了类似的问题并遵循了建议,但脚本仍然没有给出预期的输出。 请参阅我希望在文件中替换的以下文本(突出显示)以及编写的相应脚本 在该文件中,我想用“150”替换十进制值。 任何帮助都将不胜感激。谢谢你的时间 #!usr/bin/perl 2. 3严格使用; 4使用警告; 5. 6 my$filename='input_file.txt'; 7. 8 m

我编写了一个perl脚本,用其他文本替换文件中的文本,保留搜索文本的某些部分。 但是,我的脚本没有按预期工作,我在Stackoverflow中看到了类似的问题并遵循了建议,但脚本仍然没有给出预期的输出。
请参阅我希望在文件中替换的以下文本(突出显示)以及编写的相应脚本

在该文件中,我想用“150”替换十进制值。 任何帮助都将不胜感激。谢谢你的时间

#!usr/bin/perl
2.
3严格使用;
4使用警告;
5.
6 my$filename='input_file.txt';
7.
8 my$data=读取文件($filename);
9$data=~s/(g_clk.*-乘以\s\+)\d\+/$1150/ge;
10打印“$data\n”;
11写入文件($filename,$data);
12出口;
13
14子读取文件{
15我的($filename)=@;
16
17打开我的$in,':编码(UTF-8)',$filename或die“无法打开$filename'以写入$!”;;
29打印$out$内容;
30美元;
31
32返回;
33     }

通过以下方式更改regexpr:

$data =~ s/(-multiply_by\s+)\d+/$1 150/g;
它匹配“
-乘以”
”和空格(
\s+
),后跟一个或多个数字(
\d+
)。使用括号记忆文本(在
$1
中)。这在第二部分(更换部分)很有用

更新1:要替换具体节(由行号分隔),最好逐行读取文件,然后使用$。需要时应用regexpr的特殊变量。例如:

open my $in, '<:encoding(UTF-8)', $filename_in or die $!;
open my $out, '<:encoding(UTF-8)', $filename_out or die $!;

while( my $data = <$in> ) {
    if( $. >= 4 && $. <= 12) {
        # Replace only if line number ($.) is between 4 and 12
        $data =~ s/(-multiply_by\s+)\d+/$1 150/g;
    }
    # Print at output the handled line
    print $out $data;
}

close $in;
close $out;

打开我的$in,”就我所知,您的正则表达式中有一个致命错误

$data =~ s/(g_clk.*-multiply_by\s\+)\d\+/$1 150/ge;
#                                ^^   ^^
您已经跳过了加号
+
,这使它失去了作为量词的特殊意义,现在它只是表示“匹配文字加号”

如果在加号之前删除反斜杠,它应该会起作用

然而,这不是你犯的唯一错误

  • 您可以使用
    /g
    全局修饰符,即使您确实不希望每行匹配一次以上
  • 您可以使用
    /e
    eval修饰符,即使您确实不想将替换部分作为Perl代码进行求值
至于有问题的设计选择:

  • 您可以将文件拖入单个变量,而不是逐行读取,即使您确实只希望每行匹配一次(这可能就是您使用
    /g
    全局修饰符的原因)
  • 打印“$data\n”中添加额外的换行符
  • 您可以使用
    exit
    结束程序,即使程序将在可执行代码结束时自然退出
  • 如果你仍然想把文件弄脏,最好使用已经发明的模块,而不是重新发明轮子
此外,这是可以解决的“所谓的”一个班轮。这是Perl的核心功能,用于就地编辑文件。你可以做一些简单的事情:

perl -pe's/g_clk.*-multiply_by \K\d+/150/' input.txt > output.txt
这将写入一个新文件,使用shell重定向输出。您还可以使用
-i
开关就地编辑文件:

perl -pi.bak -e's/g_clk.*-multiply_by \K\d+/150/' input.txt
这将使用扩展名
.bak
保存原始文件。不过要小心,因为运行两次命令仍会覆盖原始文件。最好的选择是在尝试就地编辑之前保存永久备份

此样式的程序是此样式的简短版本(不包括就地编辑)

while(){
s/g_clk.*-将_乘以\K\d+/150/;
印刷品;
}

以下代码演示了多种方法之一

use strict;
use warnings;
use feature 'say';

my $re  = qr/^create_gene_clk .*? g_clk .*? -multiply_by \K\d+/;
my $mul = 150;

while( <DATA> ) {
    chomp;
    s/$re/$mul/;
    say;
}

__DATA__
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 204 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 324 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]

create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 14 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/D)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/E)] -multiply_by 114 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/R)] -multiply_by 001 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/T)] -multiply_by 154 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/Y)] -multiply_by 182 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/U)] -multiply_by 194 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 004 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]

create_gene_clk -name bgclk -source [get_pins (5201/U)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name bgclk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name bgclk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]

非常感谢米格尔抽出时间来。。!!!,但是,我只想替换具有“glck”(文件4到12中的行号)的行,您共享的脚本将所有行替换为150。我想知道,如果我在replace命令中包含“gclk.*”,为什么脚本不起作用。感谢Miguel从不同角度提供的解决方案。。!!!提供代码和输入/输出的可复制可复制文本示例要好得多。作为对那些试图帮助你的人的一种礼貌,他们不必花时间打印出你想要修复的东西。感谢TLP对我错误的详细解释。。所有的评论都很有帮助@索纳利:你知道你可以投票表决一个答案,如果它帮助你解决了问题,你可以把它标记为接受。
while (<>) {
    s/g_clk.*-multiply_by \K\d+/150/;
    print;
}
use strict;
use warnings;
use feature 'say';

my $re  = qr/^create_gene_clk .*? g_clk .*? -multiply_by \K\d+/;
my $mul = 150;

while( <DATA> ) {
    chomp;
    s/$re/$mul/;
    say;
}

__DATA__
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 204 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 324 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]

create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 14 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/D)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/E)] -multiply_by 114 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/R)] -multiply_by 001 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/T)] -multiply_by 154 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/Y)] -multiply_by 182 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/U)] -multiply_by 194 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 004 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]

create_gene_clk -name bgclk -source [get_pins (5201/U)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name bgclk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name bgclk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 204 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name dft_clk -source [get_pins (5201/C)] -multiply_by 324 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]

create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/D)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/E)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/R)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/T)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/Y)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/U)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name g_clk -source [get_pins (5201/C)] -multiply_by 150 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]

create_gene_clk -name bgclk -source [get_pins (5201/U)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name bgclk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]
create_gene_clk -name bgclk -source [get_pins (5201/C)] -multiply_by 104 -add -master_clk [get_clk {fin}] [get_p {pll/clk/out}]