Perl - 在文件前添加/删除行号

时间:2017-04-13 00:00:56

标签: perl

我目前正在编写一个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"

我已经想过使用循环来实现这个目标,但我觉得可能有一个更简单的解决方案。我该如何解决这个问题?

2 个答案:

答案 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);
    }

由于行号删除器使用完全相同的格式,因此意外修改错误文件的可能性不是很大。在一行不匹配后离开函数可以进一步减少它们。