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