搜索一个匹配项,找到匹配项后取匹配项后的数字并加4,这在perl中是可行的吗?

Search for a match, after the match is found take the number after the match and add 4 to it, it is posible in perl?

我是 perl 的初学者,我需要修改一个 txt 文件,将所有以前的数据保留在其中,并且只修改文件,将与特定标签相关的每个数字加 4 (< COMPRESSED-SIZE >) .该文件有很多行和标签,如下所示,我需要找到所有 标签并将 4 添加到标签附近指定的数字:

< SOURCE-START-ADDRESS >01< /SOURCE-START-ADDRESS >
< COMPRESSED-SIZE >132219< /COMPRESSED-SIZE >
< UNCOMPRESSED-SIZE >229376< /UNCOMPRESSED-SIZE >

所以我想我需要做类似的事情:搜索关键字(匹配)并将数字 132219 存储在变量中并将第二个数字 (4) 添加到它,将结果 132219 替换为 132223,其余的文件的名称必须保持不变,只有与此标签相关的数字必须更改。我无法搜索号码而不是标签,因为号码可能会更改,而标签将始终保持不变。我还需要找到所有具有此名称的标签,并通过向它们添加 4 来替换它们附近的数字。我已经有了在关键字后查找内容的代码,因为我还需要搜索另一个标签,但是这个脚本做了其他事情,在关键字前面添加了一个数字。我想我可以使用这段代码来满足我的需要,但我不知道如何进行计算并保持文件的其余部分完整,或者它是否在 perl 中可行。

 while (my $row = <$inputFileHandler>) 
{
  if(index($row,$Data_Pattern) != -1){
        my $extract = substr($row, index($row,$Data_Pattern) + length($Data_Pattern), length($row));
        my $counter_insert = sprintf "%08d", $counter;
        my $spaces = " " x index($row,$Data_Pattern);
            $data_to_send ="what i need to add" . $extract;
            print {$outs}  $spaces . $Data_Pattern . $data_to_send;
        $counter = $counter + 1;
    }
    else
    {
        print {$outs} $row;
        next;
    }
}

也许你可以帮我写一段代码来满足我的需要,$Data_Pattern 是匹配项。非常感谢!

这是一个经典的 one-liner Perl 任务。基本上你会做类似

的事情
$ perl -i.bak -pe's/^< COMPRESSED-SIZE >\K(\d+)/ + 4/e' yourfile.txt

这实际上会复制您的文件并将其替换为新的、经过编辑的文件。这可能非常危险,特别是如果您是 Perl 新手。 -i 开关在这里与 .bak 扩展一起使用,它在 yourfile.txt.bak 中保存备份。但是,这并不能使此操作安全,因为 运行两次执行该命令将覆盖备份。

建议在使用此命令之前对目标文件进行单独备份。

  • -i.bak 编辑“in-place”,文件被覆盖,创建原始文件的备份,扩展名为 .bak.
  • -p 参数被视为一个文件名,它被读取并打印回来。
  • s/ // 替换运算符,应用于文件的所有行。
  • ^ 在正则表达式中寻找行首。
  • \K 保持左边的匹配。
  • (\d+) 捕获 () 1 个或多个数字 \d+ 并将它们存储在 </code></li> 中 <li><code>/e 将替换运算符的右侧视为表达式,并将结果用作替换字符串。在这种情况下,它会增加您的人数和 return 总和。

这个命令的长版本是

while (<>) {
    s/^< COMPRESSED-SIZE >\K(\d+)/ + 4/e
}

可以放在文件中,运行用-i开关。