Perl 替换文件中特定块内的字符串
Perl replace strings within specific blocks in a file
您好,我正在尝试将文件中的字符串 test.txt 替换为如下字符串:
<g
id="g16526">
<g
<g
id="gnnnnn">
<g
并将它们变成
<g
id="gg1">
<g
...
<g
id="ggn">
<g
使用这个 perl 脚本
#!C:/Strawberry/perl
open(FILE, "<test.txt") || die "File not found";
my @lines = <FILE>;
close(FILE);
my $string = '<g
id=';
my $string2 = '<g
<g';
my $anything = ".*";
my $replace = 'gg';
my @newlines;
my $counter = 1;
foreach(@lines) {
$_ =~ s/\Qstring$anything\Q$string2/$string$replace$string2$counter/g;
$counter++;
push(@newlines,$_);
}
open(FILE, ">test.txt") || die "File not found";
print FILE @newlines;
close(FILE);
但它不起作用,任何建议表示赞赏
如果这确实有一个看起来像 XML 的结构,它应该使用模块来处理,或者 XML::LibXML or XML::Twig。
但是如图所示的这个任务也很容易以基本的方式完成
perl -0777 -wpE'
BEGIN { $cnt = 0 };
s/<g\nid="g\K(.*?)"/q(g).(++$cnt).q(")/eg;
' input.txt
期望文件格式与显示的完全一样。它通过 -0777
将整个文件读入一个字符串,这不是最漂亮的并且可能不适合非常大的文件。
另一种方法是将记录分隔符设置为<g
,因此每个"line"都是要处理的块
perl -wpE'
BEGIN { local $/ = "<g"; $cnt = 0 };
s/id="g\K(.*?)"/q(g).++$cnt.q(")/eg;
' input.txt
现在正则表达式可以自由地精确查找 id="..."
我们可以逐行处理。
这些都打印出预期的输出。它们在一行中以便于测试,我建议转移到脚本中。
您好,我正在尝试将文件中的字符串 test.txt 替换为如下字符串:
<g
id="g16526">
<g
<g
id="gnnnnn">
<g
并将它们变成
<g
id="gg1">
<g
...
<g
id="ggn">
<g
使用这个 perl 脚本
#!C:/Strawberry/perl
open(FILE, "<test.txt") || die "File not found";
my @lines = <FILE>;
close(FILE);
my $string = '<g
id=';
my $string2 = '<g
<g';
my $anything = ".*";
my $replace = 'gg';
my @newlines;
my $counter = 1;
foreach(@lines) {
$_ =~ s/\Qstring$anything\Q$string2/$string$replace$string2$counter/g;
$counter++;
push(@newlines,$_);
}
open(FILE, ">test.txt") || die "File not found";
print FILE @newlines;
close(FILE);
但它不起作用,任何建议表示赞赏
如果这确实有一个看起来像 XML 的结构,它应该使用模块来处理,或者 XML::LibXML or XML::Twig。
但是如图所示的这个任务也很容易以基本的方式完成
perl -0777 -wpE'
BEGIN { $cnt = 0 };
s/<g\nid="g\K(.*?)"/q(g).(++$cnt).q(")/eg;
' input.txt
期望文件格式与显示的完全一样。它通过 -0777
将整个文件读入一个字符串,这不是最漂亮的并且可能不适合非常大的文件。
另一种方法是将记录分隔符设置为<g
,因此每个"line"都是要处理的块
perl -wpE'
BEGIN { local $/ = "<g"; $cnt = 0 };
s/id="g\K(.*?)"/q(g).++$cnt.q(")/eg;
' input.txt
现在正则表达式可以自由地精确查找 id="..."
我们可以逐行处理。
这些都打印出预期的输出。它们在一行中以便于测试,我建议转移到脚本中。