问题描述
我是perl的初学者,我需要通过将其中所有以前的数据保留在其中来修改txt文件,并且只需在与特定标签(
< 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
开关运行。