我目前正在编写一个Perl脚本,该脚本需要在菜单中有一个选项,该选项会将行号添加到文件中,另一个选项可以删除这些行号。
示例输出:"This is the first line of my file"
应更改为"01 - This is the first line of my file"
和
"01 - This is the first line of my file"
应更改为"This is the first line of my file"
我已经想过使用循环来实现这个目标,但我觉得可能有一个更简单的解决方案。我该如何解决这个问题?
答案 0 :(得分:3)
从命令行:
按要求添加行号:
perl -ne 'printf("%02d - ",$.);print' < file > newfile
删除行号:
perl -ne 's/^\d* - //;print' < newfile
编辑文件&#34;到位&#34;使用-i标志。也是-p而不是-n和print。从命令行:
按要求添加行号:
perl -pe 'printf("%02d - ",$.)' -i file
删除行号:
perl -pe 's/^\d* - //' -i file
答案 1 :(得分:0)
由于你想在脚本中使用它,我将扩展nirys的答案:
我认为没有比使用循环更简单和可维护的解决方案。 foreach
的一个例子:
sub addLinenumbersToFile {
my($file) = @_;
open my $in_handle, "<", $file;
my @lines = <$in_handle>;
close $in_handle;
my $line_count = 1;
foreach my $line (@lines) {
# modify element directly:
$line = sprintf("%02d - ", $line_count) . $line;
$line_count++;
}
open my $out_handle, ">", $file;
print $out_handle join('', @lines);
}
然后,您可以使用文件名作为参数调用此函数:addLinenumbersToFile("inputfile.txt");
并将文件恢复为原始状态:
sub removeLinenumbersFromFile {
my($file) = @_;
open my $in_handle, "<", $file;
my @lines = <$in_handle>;
close $in_handle;
my $line_count = 1;
foreach my $line (@lines) {
my $formatted_line_count = sprintf("%02d - ", $line_count);
# modify element directly:
$line =~ s/^$formatted_line_count//;
$line_count++;
}
open my $out_handle, ">", $file;
print $out_handle join('', @lines);
}
由于行号删除器使用完全相同的格式,因此意外修改错误文件的可能性不是很大。在一行不匹配后离开函数可以进一步减少它们。