我输入文件的内容如下所示:
abc\**def\ghi**\abc\!!!!!
abc\**4nfiug\frgrefd\gtefe\wf4fs**\abc\df3gwddw
abc\**eg4/refw**\abc\f3
我需要将输入文件中abc \ --------------\abc
之间的任何字符串替换为ABC\CBA
我尝试过类似下面的内容来获取需要更换的字符串。但是当我需要使用搜索并替换时,我会卡住:
my $string1 = qr/abc\W+([^a]+)/;
my $string2 = map{/$string1/ => " "} @input_file; #the string that need to be replaced
my $string3 = 'ABC\CBA' #string i that i want it to replace to
s/$string2/$string3/g
有人可以帮忙吗?提前谢谢。
答案 0 :(得分:6)
perl -i -pe 's/this/that/g;' file1
答案 1 :(得分:2)
用于修复文件的单行程序:
perl -plwe 's/abc\\\K.*(?=\\abc)/ABC\\CBA/' input.txt > output.txt
或者作为剧本:
use strict;
use warnings;
while (<DATA>) {
s/abc\\\K.*(?=\\abc)/ABC\\CBA/;
print;
}
__DATA__
abc\**def\ghi**\abc\!!!!!
abc\**4nfiug\frgrefd\gtefe\wf4fs**\abc\df3gwddw
abc\**eg4/refw**\abc\f3
\K
(保留)转义序列表示不会删除这些字符。同样,前瞻断言(?= ... )
将保留匹配的那部分。我以为你只想改变两者之间的角色。
而不是\K
可以使用后视断言:(?<=abc\\)
。作为个人偏好,我使用\K
代替。
答案 2 :(得分:1)
#!/usr/bin/perl
use strict;
use warnings;
open my $fh,"<", "tryit.txt" or die $!;
while (my $line = <$fh>) {
$line =~ s/(abc\\)(.*?)(\\abc)/$1ABC\\CBA$3/;
print $line;
}
给出以下输入数据。这就是你要找的东西吗?
abc\ABC\CBA\abc\!!!!!
abc\ABC\CBA\abc\df3gwddw
abc\ABC\CBA\abc\f3
答案 3 :(得分:1)
要解决有关直接在文件中替换文本“inplace”的评论,您可以使用-i
开关进行单行播放。在脚本中,您可以查看使用Tie::File
,它允许对文件行进行读写访问,作为数组中的(可变)元素。复制Mike / TLP的答案:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
tie my @file, "Tie::File", "tryit.txt" or die $!;
# I think you have to use $_ here (done implicitly)
while (@file) {
s/(abc\\)(.*?)(\\abc)/$1ABC\\CBA$3/;
print;
}
答案 4 :(得分:0)
如果您不希望替换操作默认变量$_
,则必须使用=~
运算符:
#!/usr/bin/perl
use warnings;
use strict;
my @input_file = split /\n/, <<'__EOF__';
abc\**def\ghi**\abc\!!!!!
abc\**4nfiug\frgrefd\gtefe\wf4fs**\abc\df3gwddw
abc\**eg4/refw**\abc\f3
__EOF__
my $pattern = qr/abc\\.*\\abc/; # pattern to be matched
my $string2 = join "\n", @input_file; # the string that need to be replaced
my $string3 = 'ABC\CBA'; # string i that i want it to replace to
$string2 =~ s/$pattern/$string3/g;
print $string2;