perl - 搜索匹配,找到匹配后取匹配后的数字并添加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 是匹配项。非常感谢你!
解决方案
这是一个经典的单行 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
开关运行。
推荐阅读
- typescript - 如何在打字稿中表达集合差异?
- android - Unable to flutter simple flutter app on mac OS X El Capitan Version 10.11.6 (15G22010)
- android - Unity: How to make input field respond to only double taps in Android?
- ios - my react native project does not contained any app.xcworkspace file in iOS
- tensorflow - Is ArcFace strictly a loss function or an activation function?
- image - 如何将 .jpg 读入 tensorflow 数据集并使用会话显示图像
- ssl - Firefox 中格式错误的服务器 Hello(TLS1.3)
- javascript - 属性名称未知时如何在javascript中解析JSON数据
- azure - Azure DevOps - ARM 部署 - 密钥保管库和托管标识
- python - Python 3:运算符 -IndentationError