搜索匹配项,找到匹配项后将匹配项后的数字加上4,可以在perl中使用吗?

问题描述

我是perl的初学者,我需要通过将其中所有以前的数据保留在其中来修改txt文件,并且只需在与特定标签)相关的每个数字上加4即可修改文件。该文件包含许多行和标签,如下所示,我需要找到所有标签,并在标签附近指定的数字上加上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是匹配项。非常感谢!

解决方法

这是经典的单线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开关运行。