首页 > 解决方案 > 搜索匹配,找到匹配后取匹配后的数字并添加4,在perl中可以吗?

问题描述

我是 perl 的初学者,我需要通过保留所有以前的数据来修改 txt 文件,并且只通过在与特定标签(< COMPRESSED-SIZE >)相关的每个数字上添加 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 是匹配项。非常感谢你!

标签: perlnumbersaddition

解决方案


这是一个经典的单行 Perl 任务。基本上你会做类似的事情

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

这实质上将复制您的文件并将其替换为新的已编辑文件。这可能非常危险,尤其是如果您是 Perl 新手。该-i开关在这里与.bak将备份保存在yourfile.txt.bak. 但是,这不会使此操作安全,因为运行该命令两次将覆盖备份。

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

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

该命令的长版本是

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

可以将其放在文件中并使用-i开关运行。


推荐阅读