如何使用perl脚本动态替换字符串
我试图解决以下问题 我有两个文件。Address.txt和File.txt。我想使用perl脚本将所有A/B/C/D(File.txt)替换为相应的字符串值(从Address.txt文件读取)。它不会在我的输出文件中替换。我得到了与File.txt相同的内容。 我试过下面的代码 这是Address.txt文件如何使用perl脚本动态替换字符串,perl,replace,Perl,Replace,我试图解决以下问题 我有两个文件。Address.txt和File.txt。我想使用perl脚本将所有A/B/C/D(File.txt)替换为相应的字符串值(从Address.txt文件读取)。它不会在我的输出文件中替换。我得到了与File.txt相同的内容。 我试过下面的代码 这是Address.txt文件 A,APPLE B,BAL C,CAT D,DOG E,ELEPHANT F,FROG G,GOD H,HORCE 这是File.txt A B C X Y X M N O D E F
A,APPLE
B,BAL
C,CAT
D,DOG
E,ELEPHANT
F,FROG
G,GOD
H,HORCE
这是File.txt
A B C
X Y X
M N O
D E F
F G H
这是我的密码:
use strict;
use warnings;
open (MYFILE, 'Address.txt');
foreach (<MYFILE>){
chomp;
my @data_new = split/,/sm;
open INPUTFILE, "<", $ARGV[0] or die $!;
open OUT, '>ariout.txt' or die $!;
my $src = $data_new[0];
my $des = $data_new[1];
while (<INPUTFILE>) {
# print "In while :$src \t$des\n";
$_ =~ s/$src/$des/g;
print OUT $_;
}
close INPUTFILE;
close OUT;
# /usr/bin/perl -p -i -e "s/A/APPLE/g" ARGV[0];
}
close (MYFILE);
使用严格;
使用警告;
打开(MYFILE,'Address.txt');
foreach(){
咀嚼;
my@data\u new=split/,/sm;
打开INPUTFILE“,”output.txt“| | die”无法打开输出文件进行写入:$!”;
打开(我的$address_fh,“首先,这是您现有的程序,稍加重写
打开地址文件
将地址文件转换为哈希,使字母为键,字符串为值
打开另一个文件
读入其中的一行
将行拆分为单个字母
使用字母在哈希中查找
use strict;
use warnings;
open(my $a,"Address.txt")||die $!;
my %address=map {split(/,/) } map {split(' ')} <$a>;
open(my $f,"File.txt")||die $!;
my $list=<$f>;
for my $letter (split(' ',$list)) {
print $address{$letter}."\n" if (exists $address{$letter});
}
首先,这是您现有的程序,稍加重写
打开地址文件
将地址文件转换为哈希,使字母为键,字符串为值
打开另一个文件
读入其中的一行
将行拆分为单个字母
使用字母在哈希中查找
use strict;
use warnings;
open(my $a,"Address.txt")||die $!;
my %address=map {split(/,/) } map {split(' ')} <$a>;
open(my $f,"File.txt")||die $!;
my $list=<$f>;
for my $letter (split(' ',$list)) {
print $address{$letter}."\n" if (exists $address{$letter});
}
不完全确定输出的格式。是否保持行和列不变
我采取了与上述类似的方法,但格式与“file.txt”文件中的格式相同:
#!/usr/bin/perl
use warnings;
use strict;
open( my $out_fh, ">", "output.txt" ) || die "Can't open the output file for writing: $!";
open( my $address_fh, "<", "address.txt" ) || die "Can't open the address file: $!";
my %lookup = map { chomp; split( /,/, $_, 2 ) } <$address_fh>;
open( my $file_fh, "<", "file.txt" ) || die "Can't open the file.txt file: $!";
while (<$file_fh>) {
my @line = split;
for my $char ( @line ) {
( exists $lookup{$char} ) ? print $out_fh " $lookup{$char} " : print $out_fh " $char ";
}
print $out_fh "\n";
}
不完全确定输出的格式。是否保持行和列不变
我采取了与上述类似的方法,但格式与“file.txt”文件中的格式相同:
#!/usr/bin/perl
use warnings;
use strict;
open( my $out_fh, ">", "output.txt" ) || die "Can't open the output file for writing: $!";
open( my $address_fh, "<", "address.txt" ) || die "Can't open the address file: $!";
my %lookup = map { chomp; split( /,/, $_, 2 ) } <$address_fh>;
open( my $file_fh, "<", "file.txt" ) || die "Can't open the file.txt file: $!";
while (<$file_fh>) {
my @line = split;
for my $char ( @line ) {
( exists $lookup{$char} ) ? print $out_fh " $lookup{$char} " : print $out_fh " $char ";
}
print $out_fh "\n";
}
您的问题是,在foreach循环的每次迭代中,您都会覆盖先前对输出文件所做的任何更改
我的解决方案:
use strict;
use warnings;
open my $replacements, 'Address.txt' or die $!;
my %r;
foreach (<$replacements>) {
chomp;
my ($k, $v) = split/,/sm;
$r{$k} = $v;
}
my $re = '(' . join('|', keys %r) . ')';
open my $input, "<", $ARGV[0] or die $!;
while (<$input>) {
s/$re/$r{$1}/g;
print;
}
使用严格;
使用警告;
打开我的$replacements、'Address.txt'或die$!;
我的%r;
foreach(){
咀嚼;
my($k,$v)=拆分/,/sm;
$r{$k}=$v;
}
my$re='('.join('|',键%r)。');
打开我的$input,“您的问题是,在foreach循环的每次迭代中,您都会覆盖先前对输出文件所做的任何更改
我的解决方案:
use strict;
use warnings;
open my $replacements, 'Address.txt' or die $!;
my %r;
foreach (<$replacements>) {
chomp;
my ($k, $v) = split/,/sm;
$r{$k} = $v;
}
my $re = '(' . join('|', keys %r) . ')';
open my $input, "<", $ARGV[0] or die $!;
while (<$input>) {
s/$re/$r{$1}/g;
print;
}
使用严格;
使用警告;
打开我的$replacements、'Address.txt'或die$!;
我的%r;
foreach(){
咀嚼;
my($k,$v)=拆分/,/sm;
$r{$k}=$v;
}
my$re='('.join('|',键%r)。');
打开我的$input,“这里有另一个选项,可以让Perl处理文件的打开和关闭:
use strict;
use warnings;
my $addresses_txt = pop;
my %hash = map { $1 => $2 if /(.+?),(.+)/ } <>;
push @ARGV, $addresses_txt;
while (<>) {
my @array;
push @array, $hash{$_} // $_ for split;
print "@array\n";
}
地址文件的名称隐式地pop
ped off@ARGV供以后使用。然后,使用file.txt中的键/值对构建哈希
读取地址文件,split
将每一行分割成单个元素,使用定义的or(/
)运算符返回定义的散列项或单个元素,然后将其推送到@array上。最后,在print
语句中插入数组
希望这有帮助!这里有另一个选项,让Perl处理文件的打开和关闭:
use strict;
use warnings;
my $addresses_txt = pop;
my %hash = map { $1 => $2 if /(.+?),(.+)/ } <>;
push @ARGV, $addresses_txt;
while (<>) {
my @array;
push @array, $hash{$_} // $_ for split;
print "@array\n";
}
#!/usr/bin/perl -w
# to replace multiple text strings in a file with text from another file
#select text from 1st file, replace in 2nd file
$file1 = 'Address.txt'; $file2 = 'File.txt';
# save the strings by which to replace
%replacement = ();
open IN,"$file1" or die "cant open $file1\n";
while(<IN>)
{chomp $_;
@a = split ',',$_;
$replacement{$a[0]} = $a[1];}
close IN;
open OUT,">replaced_file";
open REPL,"$file2" or die "cant open $file2\n";
while(<REPL>)
{chomp $_;
@a = split ' ',$_; @replaced_data = ();
# replace strings wherever possible
foreach $i(@a)
{if(exists $replacement{$i}) {push @replaced_data,$replacement{$i};}
else {push @replaced_data,$i;}
}
print OUT trim(join " ",@replaced_data),"\n";
}
close REPL; close OUT;
########################################
sub trim
{
my $str = $_[0];
$str=~s/^\s*(.*)/$1/;
$str=~s/\s*$//;
return $str;
}
地址文件的名称隐式地pop
ped off@ARGV供以后使用。然后,使用file.txt中的键/值对构建哈希
读取地址文件,split
将每一行分割成单个元素,使用定义的or(/
)运算符返回定义的散列项或单个元素,然后将其推送到@array上。最后,在print
语句中插入数组
希望这有帮助!#!/usr/bin/perl-w
#!/usr/bin/perl -w
# to replace multiple text strings in a file with text from another file
#select text from 1st file, replace in 2nd file
$file1 = 'Address.txt'; $file2 = 'File.txt';
# save the strings by which to replace
%replacement = ();
open IN,"$file1" or die "cant open $file1\n";
while(<IN>)
{chomp $_;
@a = split ',',$_;
$replacement{$a[0]} = $a[1];}
close IN;
open OUT,">replaced_file";
open REPL,"$file2" or die "cant open $file2\n";
while(<REPL>)
{chomp $_;
@a = split ' ',$_; @replaced_data = ();
# replace strings wherever possible
foreach $i(@a)
{if(exists $replacement{$i}) {push @replaced_data,$replacement{$i};}
else {push @replaced_data,$i;}
}
print OUT trim(join " ",@replaced_data),"\n";
}
close REPL; close OUT;
########################################
sub trim
{
my $str = $_[0];
$str=~s/^\s*(.*)/$1/;
$str=~s/\s*$//;
return $str;
}
#用另一个文件中的文本替换文件中的多个文本字符串
#从第一个文件中选择文本,在第二个文件中替换
$file1='Address.txt';$file2='File.txt';
#保存要替换的字符串
%替换=();
在“$file1”中打开,或在“无法打开$file1”中死亡\n;
while()
{chomp$";
@a=拆分',',$;
$replacement{$a[0]}=$a[1];}
接近;
打开“>替换的_文件”;
打开REPL,“$file2”或die“无法打开$file2\n”;
while()
{chomp$";
@a=拆分“”,$替换的数据=();
#尽可能替换字符串
每$i(@a)
{if(exists$replacement{$i}){push@replacemented_data,$replacement{$i};}
else{push@replacemented_data$i;}
}
打印修剪(连接“”@替换的\u数据),“\n”;
}
关闭REPL;关闭;
########################################
辅助微调
{
我的$str=$\u0];
$str=~s/^\s*(.*)/$1/;
$str=~s/\s*$/;
返回$str;
}
#!/usr/bin/perl-w
#用另一个文件中的文本替换文件中的多个文本字符串
#从第一个文件中选择文本,在第二个文件中替换
$file1='Address.txt';$file2='File.txt';
#保存要替换的字符串
%替换=();
在“$file1”中打开,或在“无法打开$file1”中死亡\n;
while()
{chomp$";
@a=拆分',',$;
$replacement{$a[0]}=$a[1];}
接近;
打开“>替换的_文件”;
打开REPL,“$file2”或die“无法打开$file2\n”;
while()
{chomp$";
@a=拆分“”,$替换的数据=();
#尽可能替换字符串
每$i(@a)
{if(exists$replacement{$i}){push@replacemented_data,$replacement{$i};}
else{push@replacemented_data$i;}
}
打印修剪(连接“”@替换的\u数据),“\n”;
}
关闭REPL;关闭;
########################################
辅助微调
{
我的$str=$\u0];
$str=~s/^\s*(.*)/$1/;
$str=~s/\s*$/;
返回$str;
}
您没有描述您面临的问题编辑问题..我没有得到替换字符串。您没有描述您面临的问题编辑问题..我没有得到替换字符串。它只是替换第一行的单词。您的代码正常工作,但我的格式在输出文件中变乱。在重放后会有额外的空间ced单词。有什么想法吗?它只是在替换第一行的单词。你的代码有效,但我的代码无效