搜索一个匹配项,找到匹配项后取匹配项后的数字并加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
开关。
我是 perl 的初学者,我需要修改一个 txt 文件,将所有以前的数据保留在其中,并且只修改文件,将与特定标签相关的每个数字加 4 (< COMPRESSED-SIZE >) .该文件有很多行和标签,如下所示,我需要找到所有
< 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
开关。